Как подразумевалось выше, ANY не полностью однозначен. Если мы соз- даем запрос чтобы выбрать заказчиков которые имеют больший рейтинг чем любой заказчик в Риме, мы можем получить вывод который несколько отли- чался бы от того что мы ожидали ( как показано в Рисунке 13.5 ): SELECT * FROM Customers WHERE rating > ANY ( SELECT rating FROM Customers WHERE city = Rome ); В английском языке, способ которым мы обычно склонны интерпретиро- вать оценку " больше чем любой ( где city = Rome ) " , должен вам со- общить что это значение оценки должно быть выше чем значение оценки в каждом случае где значение city = Rome. Однако это не так, в случае ANY - исполяьзуемом в SQL . ANY оценивает как верно, если подзапрос на- ходит любое значение которое делает условие верным.
Рисунок 13.5 Как оператор "больше чем" (>) интерпретируется ANY Если мы оценим ANY способом исполяьзующим грамматику Английского Язы- ка, то только заказчики с оценкой 300 будут превышать Giovanni, кото- рый находится в Риме и имеет оценку 200. Однако, подзапрос ANY также находит Periera в Риме с оценкой 100. Так как все заказчики с оценкой 200 были выше этой, они будут выбраны, даже если имелся другой заказ- чик из Рима(Giovanni) чья оценка не была выше ( фактически, то что один из выбранных заказчиков также находится в Риме несущественно). Так как подзапрос произвел по крайней мере одно значение которое сде- лает предикат верным в отношении этих строк, строки были выбраны. Что- бы дать другой пример, предположим что мы должны были выбирать все по- рядки сумм приоретений которые были больше чем по крайней мере один из порядков на 6-е Октября: SELECT * FROM Orders WHERE amt > ANY ( SELECT amt FROM Orders WHERE odate = 10/06/1990 ); Вывод для этого запроса показывается в Рисунке 13.6. Даже если самая высокая сумма приобретений в таблице (9891.88) - имелась на 6-е Октября, предыдущая строка имеет более высокое значение суммы чем другая строка на 6-е Октября, которая имела значение суммы = 1309.95. Имея реляционный оператор ">=" вместо просто " > ", эта стро- ка будет также выбирана, потому что она равна самой себе. Конечно, вы можете использовать ANY с другой SQL техникой, например с техникой обьединения. Этот запрос будет находить все порядки со зна- чением суммы меньшей чем значение любой суммы для заказчика в San Jo- se (вывод показывается в Рисунке 13.7): SELECT * FROM Orders WHERE amt < ANY ( SELECT amt FROM Orders A, Customers b WHERE a.cnum = b.cnum AND b.city = " San Jose ' ); Даже если нименьший порядок в таблице был для заказчика из San Jose, то был второй наибольший; следовательно почти все строки будут выбра- ны. Простой способ запомнить, что < ANY значение меньшее чем наиболь- шее выбранное значение, а > ANY значение большее чем наименьшее выб- ранное значение.
Рисунок 13. 6: Выбранное значение больше чем любое(ANY) на 6-е Октября
Рисунок 13. 7: Использование ANY с объединением Фактически, вышеуказанные команды весьма похожи на следующее - (вы- вод показан на Рисунке 13.8) : SELECT * FROM Orders WHERE amt < ( SELECT MAX amt FROM Orders A, Customers b WHERE a.cnum = b.cnum AND b.city = " San Jose ' );
Рисунок 13.8: Использование агрегатной функции вместо ANY
|