понедельник, 29 августа 2011 г.

Конструкции CROSS APPLY и OUTER APPLY

Ключевое слово APPLY позволяет в возвращать результаты выполнения табличной функции для каждой строки таблицы, столбцы которой используются в качестве параметра.

Пусть у нас есть таблица с заказами

create table OrderHeader (id int)
insert OrderHeader (id) values (1)
insert OrderHeader (id) values (2)
insert OrderHeader (id) values (3)
insert OrderHeader (id) values (4)


В другой таблице, каждому заказу кроме последнего сопоставлены по два элемента

create table OrderItem (id int, orderid int)
insert OrderItem (id, orderid) values (1, 1)
insert OrderItem (id, orderid) values (2, 1)
insert OrderItem (id, orderid) values (3, 2)
insert OrderItem (id, orderid) values (4, 2)
insert OrderItem (id, orderid) values (5, 3)
insert OrderItem (id, orderid) values (6, 3)

Создадим функцию которая принимает в качестве аргумента идентификатор заказа из таблицы Order и возвращает соответствующие элементы заказа из таблицы OrderItem

CREATE FUNCTION dbo.fn_getorderdetails(@orid AS INT)
RETURNS @TREE TABLE
(
ID INT ,orderid INT
)
AS
BEGIN
insert into @TREE select ID, orderid from OrderItem where orderid=@orid
return
end

Проверим работоспособность этой функции

select * from dbo.fn_getorderdetails(2)

С помощью конструкции CROSS APPLY можно получить элементы всех заказов у которых они есть

select* from OrderHeader as oh cross apply dbo.fn_getorderdetails(oh.id)

если заменить CROSS APPLY на OUTER APPLY, в набор будут добавлены строки из таблицы Order которым не сопоставлены элементы заказов. Другими словами CROSS APPLY представляет собой некое подобие INNER JOIN, OUTER APPLY - некое подобие LEFT JOIN.

Ссылки
Использование APPLY

Комментариев нет:

Locations of visitors to this page