Korzystanie z operatora APPLY

Ukończone

Alternatywą dla łączenia lub porównywania wierszy z dwóch zestawów program SQL Server udostępnia mechanizm stosowania wyrażenia tabeli z jednego zestawu w każdym wierszu w drugim zestawie. Operator APPLY umożliwia wykonywanie zapytań, które oceniają wiersze w jednym zestawie danych wejściowych względem wyrażenia definiującego drugi zestaw danych wejściowych. FUNKCJA APPLY jest operatorem tabeli, a nie operatorem zestawu i jest częścią klauzuli FROM. Funkcja APPLY jest bardziej podobna do funkcji JOIN, a nie jako operator zestawu, który działa na dwóch zgodnych zestawach wyników zapytań.

Koncepcyjnie operator APPLY jest podobny do skorelowanego podzapytania w tym, że stosuje skorelowane wyrażenie tabeli do każdego wiersza z tabeli. Jednak funkcja APPLY zwraca wynik z wartością tabeli, a nie wynik skalarny lub wielowartszowy. Na przykład wyrażenie tabeli może być funkcją wartościową tabeli. Elementy z lewego wiersza można przekazać jako parametry wejściowe do funkcji wartości tabeli.

Istnieją dwie formy zastosowania:

  • STOSOWANIE KRZYŻOWE
  • ZASTOSOWANIE ZEWNĘTRZNE

Składnia aplikacji APPLY jest następująca:

SELECT <column_list>
FROM left_table_source { CROSS | OUTER } APPLY right_table_source 

Jest to najlepiej wyjaśnione przy użyciu przykładu. W pierwszym przykładzie użyto sprzężenia WEWNĘTRZNEgo, aby zwrócić kolumny z następujących tabel:

  • SalesLT.SalesOrderHeader.
  • SalesLT.SalesOrderDetail.

W poniższym przykładzie kodu tabele są łączone przy użyciu sprzężenia wewnętrznego:

SELECT oh.SalesOrderID, oh.OrderDate,od.ProductID, od.UnitPrice, od.Orderqty 
FROM SalesLT.SalesOrderHeader AS oh 
INNER JOIN SalesLT.SalesOrderDetail AS od 
ON oh.SalesOrderID = od.SalesOrderID;

W poniższym przykładzie kodu FUNKCJA CROSS APPLY stosuje odpowiednie źródło tabeli do każdego wiersza w źródle tabeli po lewej stronie. Zwracane są tylko wiersze z wynikami zarówno w lewej tabeli, jak i w prawej tabeli. Większość instrukcji INNER JOIN można przepisać jako instrukcje CROSS APPLY.

SELECT oh.SalesOrderID, oh.OrderDate,
od.ProductID, od.UnitPrice, od.Orderqty 
FROM SalesLT.SalesOrderHeader AS oh 
CROSS APPLY (SELECT productid, unitprice, Orderqty 
        FROM SalesLT.SalesOrderDetail AS od 
        WHERE oh.SalesOrderID = SalesOrderID
              ) AS od;

W obu przypadkach zestaw wyników jest taki sam:

A screenshot showing the result set from the CROSS APPLY operator.