Ola! esse artigo está melhor escrito aqui. Mas fique a vontade para lê-lo completamente.

APPLY

O apply é um operador de tabela que deve ser declarado logo após a cláusula from.

Funciona da seguinte forma: temos a tabela da esquerda e da direita. A tabela da direita é aplicada na esquerda sobre cada linha que a tabela da esquerda possui no conjunto do resultado.

Temos dois tipos de apply: CROSS E OUTER

No cross apply, se uma tabela da direita quando aplicada na linha da esquerda não possuir valor, ou seja, retornar vazio, ela não aparece no resultado. Diferente do que ocorre no outer apply.

Imagine o seguinte cenário para uma query: a query da esquerda retornou os resultados A, B e C e a query da direita os resultados F, G e H. Quando chegar na operação de cross apply, O conjunto de resultados da tabela da direita, será aplicado na esquerda, ficando AF, AG e AH e CF, CG, CH. 

Como para o valor B não há resultado, este não é retornado. Cross apply não retorna null ou vazio.

Diferente do Outer Apply onde o B retornaria NULL ficando: AF, AG e AH e CF, CG, CH e NULL. 

Veja abaixo, um exemplo para cada tipo de apply.

Embora pareça que o cross apply esteja retornando null, vocês vão perceber que não quando comparar com o resultado do outer apply. Estes nulls retornados no cross apply são provenientes da própria coluna que aceita NULL em sua estrutura.

Repare por exemplo que a coluna T.LASTRECEIPTCOST não possui null em seus resultados, diferente do que ocorre no outer apply.

Agora veja o resultado quando utilizamos o outer apply e a quantidade de linhas retornadas 

E se juntarmos os dois resultados para uma comparação, veja por exemplo que no cross apply, não temos o produto com ID 3 e nem o 316, isto porque, eles são desconhecidos para o cross apply, logo, ficam de fora do resultado. 

Podemos dizer que logicamente o outer apply funciona exatamente como um left join tanto que, se verificar no execution plan (control + M) verá que antes do select há uma operação de Merge Join (baseado no left join).

O apply também é muito útil por exemplo quando temos os problemas das queries abaixo visto que quando utilizamos subqueries, correlatas ou auto contidas, não podemos referenciar as colunas da query interna na externa. E nem sempre é válido utilizar um join.

Veja que na terceira query, não podemos referenciar na externa a query que recebeu o nome T, isso porque, estamos utilizando uma subquery e ela não permite esse tipo de referência.

E como podemos observar, com o cross apply é possível e mais intuitivo. 

Outro exemplo de cross apply utilizando offset e order by.

OUTER APPLY

O Outer Apply é um processo mais completo onde ele retorna resultados que não possuem ‘matches’ entre o cruzamento de informação. Por exemplo, se na query anterior tiver um cliente que não realizou pedido, o valor retornado é NULL.

Este funciona como um Left Join, uma vez que ele realiza as mesmas funções do comando citado.

Não existe nenhum comando em específico que se pareça com o Right Join dentro do grupo de Apply.

Veja o exemplo abaixo, apenas executando o Outer Apply

RESUMOS

O apply pode ser utilizado para cruzar dados de uma tabela com outra em momentos em que uma subquery encontra suas limitações e um join não seria tão eficiente.

O cross apply está muito para o cross join e o outer apply tem a mesma operação lógica que um left join.

Se quiser retornar valores nulls na consulta, utilizar o outer apply.

Espero que tenham gostado! Saúde!