2016-03-12 1 views
0

Я только что нашел оператор сравнения ALL. Я вижу некоторые примеры, какЗачем использовать ВСЕ, когда я могу использовать MAX

select ProductId, Price 
from tbl1 
where Price > ALL (select Price from tbl2) 

Когда я говорю a_value is > All (some_other_values), я всегда могу сказать a_value > MAX(some_other-values)

так выше запроса равно

select ProductId, Price 
from tbl1 
where Price > (select Max(Price) from tbl2) 

так почему SQL Server при условии ALL оператора?

+6

Что ж, если вы хотите узнать все продукты, которые оценены выше, чем средняя цена * в другой таблице? Как бы вы сделали 'WHERE price> ALL (SELECT AVG (цена) FROM dbo.Products GROUP BY Category)'? Вы не можете сказать 'WHERE price> (SELECT MAX (AVG (цена)) FROM dbo.Products)'. Теперь, я сказал, я не являюсь поклонником «ЛЮБОГО», «НЕКОТОРЫХ» или «ВСЕ», и, как «ПРАВОЕ СОЕДИНЕНИЕ», будет стремиться перезаписать запрос, чтобы избежать их. Но они находятся в стандарте, и они служат для целей, отличных от '> max()'. –

+0

@AaronBertrand, похоже, что это аккуратный ярлык. есть ли практическое использование, которое мы не можем сделать иначе? – FLICKER

+1

Я не знаю, что я когда-либо думал об этом таким образом, но нет, я не думаю, что могу представить любой запрос, который использует «ВСЕ», которые я не мог бы переписать, чтобы не использовать его. –

ответ

1

Как указано в 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) 

Таким образом, это доказывает, что оно имеет немного другое поведение по сравнению с использованием простого МАКС в подзапросе.

+1

страница не найдена. – Squirrel

+0

@Squirrel, Oop's. Обновлена ​​ссылка, содержащаяся в ответе. :) – Aditya

+0

сейчас хорошо :) – Squirrel

 Смежные вопросы

  • Нет связанных вопросов^_^