CROSS APPLY / OUTER APPLY стр. 2 |
||
А теперь представьте, что нам нужно, помимо максимальной цены, вывести минимальную, среднюю цены и т.д. Поскольку коррелирующий подзапрос в предложении SELECT должен возвращать только одно значение, в первом варианте решения нам придется фактически дублировать код для каждого агрегата:
А при использовании CROSS APPLY мы просто добавим в подзапрос требуемую агрегатную функцию:
Рассмотрим еще один пример. Соединить каждую строку из таблицы Laptop со следующей строкой в порядке, заданном сортировкой (model, code). Столбец code в сортировке используется для того, чтобы задать однозначный порядок для строк, имеющих одинаковые значения в столбце model. С помощью CROSS APPLY мы можем передать в подзапрос параметры текущей строки и выбрать первую строку из тех, которые идут ниже текущей в заданном сортировкой порядке. Итак,
Попробуйте решить эту задачу традиционными средствами, чтобы сравнить трудозатраты. Оператор OUTER APPLYКак показывают результаты предыдущего запроса, мы "потеряли" последнюю (шестую) строку из таблицы Laptop, поскольку ее не с чем соединять. Другими словами, CROSS APPLY ведет себя как внутренне соединение. Аналогом же внешнего (левого) соединения является оператор OUTER APPLY. Он отличается от CROSS APPLY только тем, что выводит все строки из левой таблицы, заменяя отсутствующие значения из правой таблицы NULL-значениями. Замена CROSS APPLY на OUTER APPLY в предыдущем запросе иллюстрирует сказанное.
Еще одной популярной задачей является вывод по N строк из каждой группы. Примером может служить вывод 5 наиболее популярных товаров в каждой категории. Рассмотрим следующую задачу. Вывести из таблицы Product по три модели с наименьшими номерами из каждой группы, характеризуемой типом продукции. Дополним решения, предложенные на сайте sql-ex.ru, решением, использующим CROSS APPLY. Идея заключается в соединении уникальных типов (первый запрос) с запросом, выводящих по 3 модели модели каждого типа из первого запроса в соответствии с требуемой сортировкой.
|