Exists работает следующим образом: «Не вернул ли (под) запрос больше, чем ноль (коррелированных) строк?» Не вернул ли (под) запрос ненулевое значение »
Это совершенно верно, существует:
SELECT * FROM person p
WHERE EXISTS (SELECT null FROM address a WHERE a.personid = p.id)
SELECT * FROM person p
WHERE EXISTS (SELECT 1 FROM address a WHERE a.personid = p.id)
SELECT * FROM person p
WHERE EXISTS (SELECT * FROM address a WHERE a.personid = p.id)
Неважно, какие значения вы возвращаете или сколько существует столбцов, заботится о том, равно ли число строк 0 или больше при определении наличия результатов
Следовательно, вы должны убедиться, что ваш (Под) запрос не возвращает строк, если вы хотите, чтобы проверка существующего провала.Если адреса, имеющие тип null , являются неприемлемыми, (под) запрос должен исключить их с WHERE a.type IS NOT NULL
, так что рассматриваются только строки с ненулевым типом
Там также мало смыславыполнение ТОП 1 в (под) запросе;Оптимизатор знает, что единственное условие, о котором он заботится, это 0 или не 0 строк, поэтому он автоматически выполняет ТОП 1 (т.е. он прекратит извлекать данные, когда узнает, что есть хотя бы одна строка)