选择没有链接任何外键的行

时间:2009-05-26 03:53:50

标签: sql linq

我有两张桌子 小组和人民

人们拥有与Group.GroupId(主键)

相关联的GroupId

如何选择没有人的群组?在t-sql和linq中

谢谢

3 个答案:

答案 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)