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

11 sql linq

我有2个表组和人

People具有链接到Group.GroupId(主键)的GroupId

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

谢谢

Mat*_*ton 26

更新

我通过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
Run Code Online (Sandbox Code Playgroud)

所以最后一个,虽然可以说是四个中最不可读的,但却表现最好.

这对我来说是一个惊喜,老实说我仍然更喜欢WHERE NOT EXISTS语法,因为我觉得它更明确 - 它读起来就像你想要做的那样.


Aar*_*ton 6

我首选的方法是左反半连接:

SELECT    g.*
FROM      Groups g
LEFT JOIN People p ON g.GroupID = p.GroupID
WHERE     p.GroupID IS NULL
Run Code Online (Sandbox Code Playgroud)

我发现它最具有整体性,灵活性和高性能.

我写了一篇关于各种查询策略的完整文章,以搜索数据的缺失 - 如果你有兴趣,可以看看这里.