Как указано в MSDN для оператора ALL (SQL Server начиная с 2008 г.), сравнивает скалярное значение с набором значений из одного столбца.
scalar_expression { = | <> | != | > | >= | !> | < | <= | !< } ALL (subquery)
Например: -
>ALL
означает больше, чем каждое значение, означает, что больше, чем максимальное значение.
Так >ALL (1, 2, 3)
означает больше, чем 3.
Аналогичным образом, оператор сравнения может быть изменен здесь, & < ALL (1, 2, 3)
означает меньше 1.
ALL
должно предшествовать операторы сравнения и он также вычисляет TRUE
, если запрос не возвращает никаких строк.
Например: -
Ниже OUTER SELECT
запрос возвращает все строки, кроме суб-запроса не возвращался ни одной строки на всех.
;WITH CTE AS (
SELECT 1 AS 'id'
UNION ALL
SELECT 1 AS 'id'
UNION ALL
SELECT 2 AS 'id'
UNION ALL
SELECT 3 AS 'id'
)
SELECT * FROM CTE WHERE id >ALL (SELECT id FROM CTE WHERE 1 = 0)
Таким образом, это доказывает, что оно имеет немного другое поведение по сравнению с использованием простого МАКС в подзапросе.
Что ж, если вы хотите узнать все продукты, которые оценены выше, чем средняя цена * в другой таблице? Как бы вы сделали 'WHERE price> ALL (SELECT AVG (цена) FROM dbo.Products GROUP BY Category)'? Вы не можете сказать 'WHERE price> (SELECT MAX (AVG (цена)) FROM dbo.Products)'. Теперь, я сказал, я не являюсь поклонником «ЛЮБОГО», «НЕКОТОРЫХ» или «ВСЕ», и, как «ПРАВОЕ СОЕДИНЕНИЕ», будет стремиться перезаписать запрос, чтобы избежать их. Но они находятся в стандарте, и они служат для целей, отличных от '> max()'. –
@AaronBertrand, похоже, что это аккуратный ярлык. есть ли практическое использование, которое мы не можем сделать иначе? – FLICKER
Я не знаю, что я когда-либо думал об этом таким образом, но нет, я не думаю, что могу представить любой запрос, который использует «ВСЕ», которые я не мог бы переписать, чтобы не использовать его. –