Вы получили предупреждение о выполнении подзапросов для каждой строки - для коррелированных подзапросов.
SELECT COUNT(*) FROM Table1 a
WHERE a.Table1id NOT IN (
SELECT b.Table1Id FROM Table2 b WHERE b.id_user = a.id_user
);
Обратите внимание, что подзапрос ссылается на столбец id_user
внешнего запроса. Значение id_user
в каждой строке Table1
может отличаться. Таким образом, результат подзапроса, вероятно, будет другим, в зависимости от текущей строки во внешнем запросе. СУБД должна выполнить подзапрос много раз, по одному разу для каждой строки во внешнем запросе.
Пример, который вы протестировали, - некоррелированный подзапрос . Большинство современных оптимизаторов СУБД, достойных их внимания, должны знать, когда результат подзапроса не зависит от значений в каждой строке внешнего запроса. В этом случае СУБД запускает подзапрос один раз, кэширует его результат и многократно использует его для предиката во внешнем запросе.
PS: В SQL IN()
называется «предикатом», а не оператором. Предикат - это часть языка, которая оценивается как истина или ложь, но не обязательно может выполняться независимо как оператор. То есть вы не можете просто выполнить это как запрос SQL: "2 IN (1,2,3);" Хотя это допустимый предикат, он не является допустимым утверждением.