Я смотрел CROSS / OUTER APPLY
с коллегой, и мы изо всех сил пытаемся найти примеры из реальной жизни, где их можно использовать.
Я потратил довольно много времени на то, чтобы узнать, когда мне следует использовать перекрестное применение вместо внутреннего соединения? и поиск в Google, но основной (единственный) пример кажется довольно странным (используя количество строк из таблицы, чтобы определить, сколько строк выбрать из другой таблицы).
Я подумал, что этому сценарию может быть полезно OUTER APPLY
:
Таблица контактов (содержит по 1 записи для каждого контакта) Таблица записей связи (может содержать n телефонных номеров, факсов, электронной почты для каждого контакта)
Но использование подзапросов, общих табличных выражений OUTER JOIN
с RANK()
и, OUTER APPLY
похоже, работает одинаково. Я предполагаю, что это означает, что сценарий неприменим к APPLY
.
Пожалуйста, поделитесь некоторыми примерами из реальной жизни и помогите объяснить эту функцию!
источник
Ответы:
Некоторые виды использования
APPLY
...1) Первые N запросов на группу (может быть более эффективным для некоторых мощностей)
2) Вызов функции с табличным значением для каждой строки внешнего запроса
3) Повторное использование псевдонима столбца
4) Отмена поворота более чем одной группы столбцов
Предполагается, что 1НФ нарушает структуру таблицы ....
Пример с использованием
VALUES
синтаксиса 2008+ .В 2005 году
UNION ALL
можно использовать вместо.источник
Существуют различные ситуации, в которых нельзя избежать
CROSS APPLY
илиOUTER APPLY
.Представьте, что у вас есть две таблицы.
МАСТЕР-ТАБЛИЦА
ДЕТАЛИ ТАБЛИЦА
Есть много ситуаций, когда нам нужно заменить
INNER JOIN
наCROSS APPLY
.1. Если мы хотим объединить 2 таблицы
TOP n
результатов сINNER JOIN
функциональностьюПодумайте, нужно ли нам выбирать
Id
иName
изMaster
и последние две даты для каждойId
изDetails table
.Приведенный выше запрос дает следующий результат.
Видите ли, он сгенерировал результаты для последних двух дат с двумя последними датами,
Id
а затем присоединил эти записи только во внешнем запросеId
, что неверно. Для этого нам нужно использоватьCROSS APPLY
.и формирует следующий результат.
Вот рабочий. Внутренний запрос
CROSS APPLY
может ссылаться на внешнюю таблицу, гдеINNER JOIN
этого сделать нельзя (возникает ошибка компиляции). При обнаружении последних двух дат, вступив делается внутриCROSS APPLY
т.е.WHERE M.ID=D.ID
.2. Когда нам нужна
INNER JOIN
функциональность с использованием functions.CROSS APPLY
может использоваться как замена,INNER JOIN
когда нам нужно получить результат изMaster
таблицы и afunction
.А вот функция
что привело к следующему результату
1. Если мы хотим объединить 2 таблицы
TOP n
результатов сLEFT JOIN
функциональностьюПодумайте, нужно ли нам выбирать Id и Name из
Master
и последние две даты для каждого Id изDetails
таблицы.что дает следующий результат
Это приведет к неправильным результатам, т.е. принесет из
Details
таблицы только последние две даты, независимо от того,Id
даже если мы присоединяемся кId
. Итак, правильное решение - использоватьOUTER APPLY
.что формирует следующий желаемый результат
2. Когда нам нужно
LEFT JOIN
использовать функциональностьfunctions
.OUTER APPLY
может использоваться как замена,LEFT JOIN
когда нам нужно получить результат изMaster
таблицы и afunction
.И функция идет здесь.
что привело к следующему результату
CROSS APPLY
илиOUTER APPLY
может использоваться для сохраненияNULL
значений при отмене поворота, которые являются взаимозаменяемыми.Считайте, что у вас есть таблица ниже
Когда вы используете
UNPIVOT
для переносаFROMDATE
ANDTODATE
в один столбец,NULL
значения по умолчанию удаляются .что дает результат ниже. Обратите внимание, что мы пропустили запись
Id
числа3
В таких случаях
CROSS APPLY
илиOUTER APPLY
будет полезнокоторый формирует следующий результат и сохраняет
Id
его значение3
источник
Одним из реальных примеров может быть случай, если у вас есть планировщик и вы хотите узнать, какая последняя запись в журнале была для каждой запланированной задачи.
источник
Чтобы ответить на вопрос выше, приведите пример:
А теперь запустите два запроса с планом выполнения.
Вы можете видеть, что внешний запрос на применение более эффективен. (Не могу прикрепить план, так как я новый пользователь ... Дох.)
источник