Вопрос

Учитывая следующие определения:

CREATE TABLE MyTable
(
    col1 int,
    col2 int,
    col3 int,
    col4 int
)

CREATE FUNCTION fn_MyFunction
(
    @Param1 int,
    @Param2 int
)
RETURNS TABLE AS RETURN
(
    SELECT @Param1 * 2 AS 'res1', @Param2 * 4 AS 'res2', @Param1 AS 'col3'
)

Я пытаюсь присоединиться к функции к таблице, чтобы получить рассчитанное значение (S) за ряд. Пример: в таблице бронирования мне нужно получить цену на основе даты начала и даты окончания.

Вот пример запроса:

SELECT      tbl.col1
,           tbl.col2
,           tbl.col3
,           fn.res1
,           fn.res1
FROM        MyTable tbl
CROSS APPLY fn_MyFunction(tbl.col3, tbl.col4) fn
WHERE       fn.col3 = tbl.col3

Хотя я думаю, что получаю правильные результаты в моем реальном запросе, как CROSS APPLY Получить результаты в этом случае? Получает ли они в ряду (эффективно)? Или это работает так же, как и CROSS JOIN (т.е. изготовление декартового продукта)?

Это было полезно?

Решение

CROSS APPLY принимает таблицу, оцененную функцию и «применяет» параметры из каждой строки в запросе, к которому вы ее применяете. Функция оценивается один раз для каждой строки, и выход неявно соединяется с строкой источника в наборе записей, из которого были получены параметры. Обратите внимание, что это «соединение» может быть 1: M - с ряд ряд TVF в исходном источнике может генерировать несколько строк вывода от TVF.

Вам не нужно использовать больше предикатов в предложении «Где», чтобы присоединиться к результатам, если (по какой -то причине) вы хотите дальше отфильтровать вывод функции, применив дополнительный предикат.

CROSS APPLY довольно полезен с запросами XPath, если вам нужно идти по полевым полям, которые могут содержать повторяющиеся группы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top