Crie um site como este com o WordPress.com
Comece agora

Você conhece o operador APPLY?

Olá pessoal, tudo bem? 

Hoje eu vim falar sobre o operador APPLY. (CROSS APPLY e OUTER APPLY) 

Você já conhece este operador? Ele é um excelente recurso que podemos utilizar em diversos casos do dia a dia.

 Saber aplica-lo e entender suas variações podem por muitas vezes nos fazer enxergas soluções que podem gerar até mesmo um ganho de desempenho em nossas queries. 

Caso você já conheça sobre os tipos de JOINs verá que são bem parecidos com o operador APPLY, dito isto, já deve ter imaginado que de certa forma, ele faz algum tipo de junção. 

Demonstrarei variações de uso deste operador em casos abaixo: 

*LINK PARA O SCRIPT NO FINAL DO POST.  

CROSS APPLY 

Primeiro exemplo: 

Listar todos os clientes que tem orçamento e seus respectivos valores. 

 Uma das opções para chegar neste resultado é a utilizar o operador INNER JOIN. 

Podemos obter o mesmo resultado com a utilização do operador CROSS APPLY.

Note que na imagem abaixo, dentro do operador CROSS APPLY eu consulto a tabela que desejo fazer a junção e fecho as chaves no WHERE.  

Segundo exemplo: 

Listar os dois maiores valores de orçamento de cada cliente. 

É comum no meu dia a dia ver a utilização de cursores para alcançar este objetivo, porém, o operador CROSS APPLY nos dá uma solução bem prática e mais performática. 

Este é um caso de uso bem legal, pois utilizando INNER JOIN não conseguiríamos obter os mesmos resultados, pois é uma limitação do JOIN não poder fazer referência externa, e é claro, se retirarmos o WHERE abaixo, no final, a consulta só retornaria 2 linhas, não atendendo o solicitado. 

Terceiro exemplo: 

Juntar cada linha de uma tabela, com todas as outras linhas de outra tabela. (Plano Cartesiano) 

Para isto é comum vermos a utilização do CROSS JOIN:  

Mais uma vez, podemos obter o mesmo valor utilizando o CROSS APPLY.

Quando não adicionado predicado no operador CROSS APPLY, é feito a junção de todas as linhas. Caso não tenha ficado claro, quando não passamos o predicado é como se tivéssemos “filtrando” WHERE 1=1.

Quarto exemplo: 

Seguindo o raciocínio do exemplo acima, referente a não ter predicado, podemos fazer o mesmo com funções de tabela, onde cada linha passa pela função, sem filtro.  

OBS: No script da demo foi criado uma função que obtém um valor e divide por 2, somente para mostrar como chamar a função em conjunto com o operador CROSS APPLY. 

Quinto exemplo: 

Podemos fazer até mesmo uma versão similar ao UNPIVOT utilizando CROSS APPLY, junto com a função VALUES. 

OBS: Para facilitar a compreensão do caso acima, basta você lembrar do INSERT INTO com VALUES, quando utilizamos a virgula entre os parênteses quer dizer que será adicionado uma nova linha para aquele valor. 

OUTER APPLY 

Agora que você entendeu o operador CROSS APPLY, é provável que você tenha notado uma semelhança absurda com o INNER JOIN no sentido lógico, pensando desta forma, conseguimos pensar no operador OUTER APPLY como LEFT JOIN. 

Sexto exemplo: 

Listar todos os clientes que tem ou não orçamento e seus valores de orçamento. 

Podemos chegar no mesmo resultado com OUTER APPLY: 

Podemos aplicar o OUTER APPLY de diversas formas, como as que foram listadas acima nos exemplos do CROSS APPLY. Lembre-se da diferença, estamos considerando também o conjunto a esquerda. 

Acredito que ao chegar neste ponto, já tenha entendido todo o conceito do operador APPLY, porém, fique atento quando utilizar funções de agregação dentro do CROSS APPLY, entenda o porquê. 

Sétimo exemplo: 

Listar a soma dos valores de todos os clientes que tem orçamento: 

Caso fossemos utilizar o operador CROSS APPLY para isto, provavelmente seria possível que após a explicação você chegue neste código T-SQL: 

Acima, notamos que CAIO E IGOR que não tem orçamento apareceram (teríamos o mesmo resultado com OUTER APPLY), o que contradiz pensar que CROSS APPLY tem sempre o mesmo comportamento lógico de um INNER JOIN.  Neste caso, se deseja o comportamento como INNER , devemos utilizar um GROUP BY, podendo ser pela chave do JOIN ou até mesmo por um parêntese vazio. 

Conclusão

Foram listados diversos exemplos para que você entenda como ele age em cada situação. Não necessariamente as soluções expostas acima substituem as mais comuns, porém, ao meu ver, é importante enxergar e validar cada caso. 

Link para os scripts utilizados: https://github.com/Nusyc/OperadorApply 

É isso pessoal, um abraço. 

Publicidade

3 comentários em “Você conhece o operador APPLY?

Adicione o seu

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.

Blog no WordPress.com.

Acima ↑

%d blogueiros gostam disto: