我有一个简单的表,其中包含项之间的引用。在另一个表中,项目组合在一起。每个项目可以是任意数量的组。
示例:
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)
我发现有点问题是我有两个相同的子选择。
我的问题:
有没有更好的方法将两列限制为相同的子选择?
答案 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