Многократное сравнение
При проверке на принадлежность результатам вложенного запроса с помощью предиката IN осуществляется многократное сравнение значения таблицы главного запроса с набором значений из таблицы вложенного запроса.
В SQL имеются еще две разновидности множественной проверки, осуществляемые с помощью предикатов ANY и ALL. С помощью этих предикатов проверка осуществляется не только на совпадение, но и на «больше» или «меньше».
Предикат ANY сравнивает проверяемое значение с набором данных, выбираемых вложенным запросом, используя операторы «=», «<>», «<», «<=», «>», «>=». Проверяемое значение поочередно сравнивается с каждым значением из набора данных. Если любое из этих сравнений дает значение TRUE, то и проверка ANY возвращает значение TRUE.
Приведем пример использования предиката ANY: вывести список служащих, принявших заказ на сумму, большую, чем на 10% от плана.
SELECT FAMILY, NAME
FROM SLUZHASCHIE S
WHERE (0.1*QUOTA < ANY (SELECT PRICE_ALL
FROM ZAKAZY Z
WHERE S.ID_SLZH = Z.ID_SLZH))
FAMILY | NAME |
Ганин | Сергей |
Петров | Петр |
Нилов | Лев |
Главный запрос последовательно проверяет все строки таблицы SLUZHASCHIE. Вложенный запрос находит все запросы, принятые текущим служащим, и возвращает набор данных, содержащий стоимости этих заказов. Предложение WHERE главного запроса вычисляет 10% от плана текущего служащего и использует это число в качестве проверяемого значения, сравнивая его со стоимостью каждого заказа, выбранного вложенным запросом.
Если есть хотя бы один заказ, стоимость которого превышает вычисленное значение, то проверка < ANY возвращает значение TRUE, а имя служащего заносится в результирующую таблицу. Если таких заказов нет, имя служащего в результирующую таблицу не заносится.
Предикат ALL, как и предикат ANY, использует один из шести операторов («=», «<>», «<», «<=», «>», «>=») для сравнения проверяемого значения с набором данных, выбранных вложенным запросом. В данном случае проверяемое значение последовательно сравнивается с каждым значением из набора данных. Если все сравнения дают положительный результат, то предикат ALL возвращает значение TRUE.
Пример. Вывести список офисов с их плановыми объемами продаж, все служащие которых превысили плановый объем продаж на 50% от плана офиса.
SELECT CITY, TARGET
FROM OFFICY O
WHERE (0.50*TARGET < ALL (SELECT SALES
FROM SLUZHASCHIE S
WHERE O.ID_OFC = S.ID_OFC))
CITY | TARGET |
Инза | $300 000.00 |
Буинск | $575 000.00 |
Орел | $350 000.00 |
Главный запрос последовательно проверяет строку за строкой таблицы OFFICY. вложенный запрос находит всех служащих, работающих в текущем офисе, и возвращает значение с фактическими объемами продаж для каждого служащего.
Предложение WHERE главного запроса вычисляет 50% от плана продаж офиса и сравнивает полученное значение со всеми объемами продаж, выдаваемыми вложенным запросом. Если все объемы продаж превышают вычисленное значение, то предикат < ALL возвращает значение TRUE и текущий офис включается в результирующую таблицу.
Дата добавления: 2015-02-03; просмотров: 925;