Thursday, April 18, 2013

Когда юзать CROSS APPLY

Если в задаче требуется для каждого элемента списка одной таблицы найти список строк из другой таблицы, например, для каждого продавца показать три его любимых города или вывести для каждого продавца три его последних заказа за 1998 год.

При этом учитывайте, что CROSS APPLY аналогичен INNER JOIN, а OUTER APPLY - LEFT JOIN


вывести для каждого продавца три его последних заказа за 1998 год. 

Подготовим подзапрос для определения 3 последних заказов продавца 1
SELECT TOP (3) *
FROM Orders
WHERE Year (OrderDate) = 1998
AND EmployeeID = 1
ORDER BY OrderDate DESC

Сделаем к этому подзапросу CROSS APPLY

SELECT *
FROM Employees E CROSS APPLY (
                                               SELECT TOP (3) *
                                               FROM Orders
                                               WHERE Year (OrderDate) = 1998
                                               AND EmployeeID =E.EmployeeID
                                               ORDER BY OrderDate DESC
                                               ) MyList
ORDER BY E.EmployeeID



-- для каждого продавца показать три первых номера заказа, которые он отправил в свой родной город

SELECT FirstName+ ' ' + LastName, MyList.*
-- FROM Employees E CROSS APPLY
FROM Employees E OUTER APPLY -- Выберем OUTER APPLY, чтобы увидеть еще и нулевые записи NULL для тех, кто не отправлял вообще ничего в свой город
                            (
                            SELECT TOP (3) WITH TIES OrderID
                            FROM Orders
                            WHERE EmployeeID = E.EmployeeID
                            AND ShipCITY=E.City
                            ORDER BY OrderDate ASC
                            ) MyList
Order by FirstName+ ' ' + LastName


No comments: