Сейчас на сайте
Сейчас на сайте 0 пользователей и 0 гостей.

EXISTS и агрегаты

Одна вещь, которую EXISTS не может сделать - взять функцию агрегата в подзапросе. Это имеет значение. Если функция агрегата находит любые строки для операций с ними, EXISTS верен, не взирая на то, что это - значение функции ; если же агрегатная функция не находит никаких строк, EXISTS неправилен.

SQL Execution Log

SELECT DISTINCT snum FROM Salespeople outer| WHERE NOT EXISTS |(SELECT *

FROM Customers inner WHERE inner.snum = outer.snum

AND inner.cnum < > outer.cnum);

cnum
1003
1004
1007

Рисунок 12.4: Использование EXISTS с NOT

Попытка использовать агрегаты с EXISTS таким способом, вероятно покажет, что проблема неверно решалась от начала до конца. Конечно, подзапрос в предикате EXISTS может также использовать один или более из его собственных подзапросов. Они могут иметь любой из различных типов, которые мы видели ( или который мы будем видеть ). Такие подзапросы, и любые другие в них, позволяют использовать агрегаты, если нет другой причины. по которой они не могут быть исполяьзованы. Следующий раздел приводит этому пример.

В любом случае, вы можете получить тот же самый результат более легко, выбрав поле которое вы исполяьзовали в агрегатной функции, вместо исполяьзования самой этой функции. Другими словами, предикат - EXISTS (SELECT COUNT (DISTINCT sname) FROM Salespeople) - будет эквивалентен - EXISTS (SELECT sname FROM Salespeople), который был позволен выше.