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语法,因为我觉得它更明确 - 它读起来就像你想要做的那样.
我首选的方法是左反半连接:
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)
我发现它最具有整体性,灵活性和高性能.
我写了一篇关于各种查询策略的完整文章,以搜索数据的缺失 - 如果你有兴趣,可以看看这里.
| 归档时间: |
|
| 查看次数: |
4914 次 |
| 最近记录: |