4

thingsでリストされたアイテムでいっぱいのテーブルが1つありますItemID。ItemIDが与えられた場合、ItemIDを持つレコードと、同じである他のすべてのアイテムを取得する必要がありますname

以下のサンプルデータでは、ItemIDが1の場合、ItemID 1のレコードを含め、ItemID 1と同じ名前(この場合は「poptarts」)のすべてのレコードを選択する必要があります。

ItemID = 1 name = poptarts
ItemID = 7 name = poptarts
ItemID = 8 name = cheddar
ItemID = 323 name = poptarts

select a.ItemID, a.name from things where a.ItemID = '1'
UNION
select b.ItemID, b.name from things where b.name = a.name

ただし、上記で記述したSQLは、2番目のselectにa.nameを渡しません。名の値を2番目の選択に渡す方法はありますか?ステートメントが最初の行としてitemid=1を返し、他の行として7と323を返すようにしたいと思います。

4

4 に答える 4

3

UNION実際には、2つの異なるセットを連結するためにのみ使用されます。あなたの例に基づいて、あなたはおそらくこのようなことをすることができます:

SELECT a.ItemID, a.Name
FROM things a
WHERE name IN (SELECT name FROM things WHERE itemID = 1)

この種のクエリを作成する方法はたくさんあり、使用しているSQLのフレーバーによって異なりますが、これは多かれ少なかれ普遍的である必要があります。

于 2012-12-19T20:56:07.590 に答える
1
select 
  a.itemID,
  a.name
from
  things a
where a.name in (
  select name
  from things b
  where b.itemID = '1'
)
于 2012-12-19T20:57:00.647 に答える
1
SELECT this.name, this.id, that.id
FROM thing this
LEFT JOIN thing that ON that.name=this.name AND that.id <> this.id
WHERE this.id = 1
   ;

注:これは、ツインレコードを持たないthis-rowsも選択します。その場合、that.idはNULLになります。ツインレコードのないレコードを抑制したい場合は、を削除してLEFTください。

更新:明らかな一致を抑制するためにid<>id句を追加しました。

于 2012-12-19T21:06:18.990 に答える
0

UNION本当にテーブルが1つしかない場合は、テーブルを2回、、またはhtatのような派手なものを持ち込む必要はありません。

SELECT 
    name
FROM
    a --assuming this is your only table
GROUP BY 
    itemID, name
HAVING
    itemID = '1'
于 2012-12-19T20:58:35.793 に答える