Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 ANY and ALL  [new]
kernel32
Member

Откуда:
Сообщений: 6
Добрый вечер. Не могу понять - в чем отличие
select * from Orders
where sum>ALL
(select sum from Orders where date='10/06/1990');

от
select * from Orders
where sum>ANY
(select sum from Orders where date='10/06/1990');


В книге как-то запутано написано объяснение. Насколько я понял оператор ALL вернет все значения sum из таблицы Orders на указаную дату после чего поочередно сравнятся все эти значения со всеми значениями таблицы Orders. То есть таким образом на вывод получим все sum которые были больше за sum на дату 10/06/1990.

Оператор ANY выводит как-то все подряд.. Что с чем он сравнивает? Я думал что он просто берет первое попавшееся значение из внутреннего запроса и сравнивает его со всеми значениями в таблице Orders.. Но тут явно что-то не так.. Вобщем помогите пожалуйста разобраться с этим ANY, я уже устал гуглить, везде пишут одно и то же. Спасибо
4 мар 13, 20:15    [14010849]     Ответить | Цитировать Сообщить модератору
 Re: ANY and ALL  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
kernel32
Я думал что он просто берет первое попавшееся значение из внутреннего запроса и сравнивает его со всеми значениями в таблице Orders
Не первое попавшееся, а все. Если в результате подзапроса найдется хоть одно значение sum, меньшее sum из основного, предикат будет вычислен как истина.

ALL/ANY может быть будет проще понять, если раскрыть их через not exists/exists
ALL:
select * from Orders o
where
 not exists(select sum from Orders where date='10/06/1990' and sum <= o.sum);

ANY:
select * from Orders o
where
 exists(select sum from Orders where date='10/06/1990' and sum < o.sum);
4 мар 13, 20:46    [14010889]     Ответить | Цитировать Сообщить модератору
 Re: ANY and ALL  [new]
kernel32
Member

Откуда:
Сообщений: 6
Правильно ли я понимаю?
ANY - для того чтобы предикат был истиной нужно чтобы значение sum в подзапросе было меньше чем любое sum из основного запроса. Тогда строка будет на вывод
ALL - нужно чтобы все значения sum в подзапросе были меньше чем все (любое) sum в основном запросе. Если этого не произойдет - предикат вернет ложь и на вывод ничего не получим
4 мар 13, 21:29    [14010967]     Ответить | Цитировать Сообщить модератору
 Re: ANY and ALL  [new]
kernel32
Member

Откуда:
Сообщений: 6
То есть ANY как бы по отдельности сравнивает все значения sum подзапроса, а ALL - значения sum рассматриваются не по отдельности, а вместе, как-бы группой
4 мар 13, 21:32    [14010976]     Ответить | Цитировать Сообщить модератору
 Re: ANY and ALL  [new]
--------------------------------
Guest
any - хотя бы один из множества удовлетворяет условию
all - все элементы множества множества удовлетворяют условию
5 мар 13, 14:38    [14014701]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить