13.2.10.4 Подзапросы с ALL
Синтаксис:
operand comparison_operator ALL (subquery)
Слово ALL, которое должно следовать за оператором сравнения, означает “вернуть TRUE, если сравнение является TRUE для ALL значений в столбце, который возвращает подзапрос.” Например:
SELECT s1 FROM t1 WHERE s1 > ALL (SELECT s1 FROM t2);
Предположим, что в таблице t1 есть строка, содержащая (10). Выражение является TRUE, если таблица t2 содержит (-5,0,+5), потому что 10 больше, чем все три значения в t2. Выражение является FALSE, если таблица t2 содержит (12,6,NULL,-100), потому что существует единственное значение 12 в таблице t2, которое больше, чем 10. Выражение является неизвестным (то есть NULL), если таблица t2 содержит (0,NULL,1).
Наконец, выражение является TRUE, если таблица t2 пуста. Таким образом, следующее выражение является TRUE, когда таблица t2 пуста:
SELECT * FROM t1 WHERE 1 > ALL (SELECT s1 FROM t2);
Но это выражение является NULL, когда таблица t2 пуста:
SELECT * FROM t1 WHERE 1 > (SELECT s1 FROM t2);
Кроме того, следующее выражение является NULL, когда таблица t2 пуста:
SELECT * FROM t1 WHERE 1 > ALL (SELECT MAX(s1) FROM t2);
В общем, таблицы, содержащие NULL значения и пустые таблицы являются “крайними случаями.” При написании подзапросов всегда учитывайте, учтены ли эти два варианта.
NOT IN является псевдонимом для <>
ALL. Таким образом, эти два утверждения эквивалентны:
SELECT s1 FROM t1 WHERE s1 <> ALL (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 NOT IN (SELECT s1 FROM t2);
© 2025 Oracle
Licensed under the GPLv2 License.