SELECT U.*
FROM Units U
WHERE NOT EXISTS (
SELECT 1
FROM People P
WHERE U.ID = P.UnitID
)
Обратите внимание, что это называется (анти) полусоединением. Это фактическое соединение, а не коррелированный подзапрос.
Другой обычно используемый метод:
SELECT U.*
FROM
Units U
LEFT JOIN People P ON U.ID = P.UnitID
WHERE
P.UnitID IS NULL
Обратите внимание, что в предложении объединения должны быть указаны дополнительные критерии для объединения (скажем, вы хотите присоединиться только к тем, кто был активен). Сказать "1007 *.
" не получится
По моему опыту, каждый из разных запросов может оказаться победителем в зависимости от выбранного плана выполнения. То, как механизм использует статистику для прогнозирования количества строк, может заставить его выбирать неоптимальные планы выполнения для некоторых запросов, даже если статистика обновляется должным образом.
Примечание: использование «SELECT 1» в полусоединениях вместо «SELECT *» сэкономит некоторые циклы во время компиляции запроса, поскольку * фактически расширяется до списка столбцов, а затем удаляется.