Use o operador APPLY

Concluído

Como alternativa à combinação ou comparação de linhas de dois conjuntos, o SQL Server fornece um mecanismo para aplicar uma expressão de tabela de um conjunto em cada linha do outro conjunto. O operador APPLY permite consultas que avaliam linhas em um conjunto de entrada em relação à expressão que define o segundo conjunto de entradas. APPLY é, na verdade, um operador de tabela, não um operador de conjunto, e faz parte da cláusula FROM. APPLY é mais como um JOIN, em vez de como um operador de conjunto que opera em dois conjuntos de resultados compatíveis de consultas.

Conceitualmente, o operador APPLY é semelhante a uma subconsulta correlacionada na medida em que aplica uma expressão de tabela correlacionada a cada linha de uma tabela. No entanto, APPLY retorna um resultado com valor de tabela em vez de um resultado escalar ou com vários valores. Por exemplo, a expressão de tabela pode ser uma função com valor de tabela. Você pode passar elementos da linha esquerda como parâmetros de entrada para a função com valor de tabela.

Existem duas formas de CANDIDATURA:

  • APLICAÇÃO CRUZADA
  • APLICAÇÃO EXTERIOR

A sintaxe para APPLY é a seguinte:

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

Isto é melhor explicado com um exemplo. O primeiro exemplo usa um INNER JOIN para retornar colunas das tabelas a seguir:

  • SalesLT.SalesOrderHeader.
  • SalesLT.SalesOrderDetail.

No exemplo de código a seguir, as tabelas são unidas usando um INNER JOIN:

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;

No exemplo de código a seguir, CROSS APPLY aplica a fonte da tabela direita a cada linha na fonte da tabela esquerda. Somente as linhas com resultados na tabela esquerda e na tabela direita são retornadas. A maioria das instruções INNER JOIN pode ser reescrita como instruções 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;

Em ambos os casos, o conjunto de resultados é o mesmo:

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