Первый запрос, как он есть, возвращает все строки таблицы TABLE1, где a
соответствует всем значениям a
в таблице TABLE2. Следовательно, он вернет ноль строк, , если только в TABLE2 нет единственного ненулевого значения для a
, и это значение существует в TABLE1. В этом случае он вернет столько строк, сколько имеется в TABLE1 с этим значением a
.
Второй запрос совершенно другой. Он просто вернет все строки таблицы TABLE1, где a
не существует в таблице TABLE2.
То есть « соответствует всем » (запрос 1) против « не соответствует ни одному » (запрос 2). Тот факт, что вы получаете одинаковое количество строк, является чистым совпадением.
Ваши запросы будут эквивалентны, если вы изменили !=
на =
в первом, например:
SELECT a, b
FROM table1
WHERE NOT EXISTS(
SELECT a, c
FROM TABLE2
WHERE table2.a = table1.a)
Получает значения a
в таблице1, которых нет в таблице2. Это точно так же, как:
SELECT table1.a, b
FROM table1
LEFT JOIN table2 ON table2.a = table1.a
WHERE table2.a IS NULL
Как вы понимаете, они НЕ эквивалентны. Вы должны изменить !=
на =
в первом, чтобы сделать их такими.