Aktualizacja
Zabrakło mi cztery różne sposoby, aby to zrobić za pomocą programu SQL Server 2005 i obejmował plan wykonania.
-- 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
Tak więc ostatni, choć prawdopodobnie najmniej czytelny z czterech, wykonuje najlepiej.
To zaskakuje mnie i szczerze mówiąc nadal wolę składnię WHERE NOT EXISTS, ponieważ uważam, że jest bardziej jednoznaczna - czyta dokładnie tak, jak próbujesz.
wow to jest super. dziękuję w jaki sposób otrzymałeś statystyki procesora? –
Profiler programu SQL Server. Informuje, ile odczytów i czasu procesora zajęło każde zapytanie (sprawdziłem je jeden po drugim). –