人们拥有与Group.GroupId(主键)
相关联的GroupId如何选择没有人的群组?在t-sql和linq中
谢谢
答案 0 :(得分:24)
<强>更新强>
我通过SQL Server 2005运行了四种不同的方法,并包含了执行计划。
-- 269 reads, 16 CPU
SELECT *
FROM Groups
WHERE NOT EXISTS (
SELECT *
FROM People
WHERE People.GroupId = Groups.GroupId
);
-- 249 reads, 15 CPU
SELECT *
FROM Groups
WHERE (
SELECT COUNT(*)
FROM People
WHERE People.GroupId = Groups.GroupId
) = 0
-- 249 reads, 14 CPU
SELECT *
FROM Groups
WHERE GroupId NOT IN (
SELECT DISTINCT GroupId
FROM Users
)
-- 10 reads, 12 CPU
SELECT *
FROM Groups
LEFT JOIN Users ON Users.GroupId = Groups.GroupId
WHERE Users.GroupId IS NULL
所以最后一个,虽然可能是四个中最不可读的,但表现最好。
这对我来说是个惊喜,老实说我还是更喜欢WHERE NOT EXISTS语法,因为我觉得它更明确 - 它读起来就像你想要做的那样。
答案 1 :(得分:6)
我首选的方法是左反半连接:
SELECT g.*
FROM Groups g
LEFT JOIN People p ON g.GroupID = p.GroupID
WHERE p.GroupID IS NULL
我发现它最具有整体性,灵活性和高效性。
我写了一篇关于搜索缺少数据的各种查询策略的整篇文章 - 如果您有兴趣,请查看here。
答案 2 :(得分:2)
我认为最简单的解决方案是:
SELECT *
FROM GROUPS
WHERE GroupId NOT IN (SELECT DISTINCT GroupId FROM People)