在SQL

时间:2016-05-03 11:58:56

标签: sql sql-server subquery

我有一个简单的表,其中包含项之间的引用。在另一个表中,项目组合在一起。每个项目可以是任意数量的组。

示例:

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 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

另一种选择:

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