2016-05-03 7 views
1

アイテム間の参照を含む単純なテーブルがあります。別の表では、項目はグループ化されています。各項目は任意の数のグループに含めることができます。SQL内の同じIN副選択を削除します

例:

Items: 
ItemID | ItemName 
------------------ 
1  | Item 1 
2  | Item 2 
3  | Item 3 
4  | Item 4 

Groups: 
GroupID | ItemID 
----------------- 
1  | 1 
1  | 2 
1  | 4 
2  | 2 
2  | 3 

References: 
RefSourceItem | RefTargetItem 
------------------------------- 
1    | 2 
2    | 3 
2    | 4 

は今、私はつまり、ソースとターゲットが同じグループに両方とも、特定のグループ内のすべての参照を選択します。私が思いついたのステートメントはこれです:私は少し問題を見つける何

SELECT * FROM References 
WHERE RefSourceItem IN (SELECT ItemID FROM Groups WHERE GroupID = 1) 
AND RefTargetItem IN (SELECT ItemID FROM Groups WHERE GroupID = 1) 

私は2つの同一の副選択を持っているということです。

私の質問
2つの列を同じ副選択に制限するより良い方法はありますか?

+2

あなたのアプローチは結構です。 –

答えて

1

私はジョインを使ってこれを書く傾向がありますが、わかるように、両方のテーブルをチェックする必要があるので、重複はあります。ジョインはあなたの環境に応じてより効率的かもしれませんが、試してみる価値があります。

SELECT    * 
FROM    References AS R 
         LEFT OUTER JOIN Groups AS G1 ON R.RefSourceItem = G.ItemID AND G.GroupID = 1 
         LEFT OUTER JOIN Groups AS G2 ON R.RefTargetItem = G2.ItemID AND G2.GroupID = 1 
WHERE    (G1.ItemID IS NOT NULL OR G2.ItemID IS NOT NULL) 
+0

これは少なくとも動作します。私はそれがOPのクエリ上の改善であるかどうかを確認することができません。 –

+0

@GordonLinoffはい、あなたが正しいです、私が述べたように、ちょうど代替を提供しています。 – William

0

1つの代替:

SELECT r.RefSourceItem, r.RefTargetItem 
FROM References r 
JOIN Groups g 
    ON g.ItemID IN (r.RefSourceItem, r.RefTargetItem) AND g.GroupID = 1 
GROUP BY r.RefSourceItem, r.RefTargetItem 
HAVING COUNT(*) = 2 
関連する問題