Boa Noite senhoreeeees!!! Hoje eu vou falar sobre o APPLY.
Esse cara serve para fazer uma espécie de JOIN só que sem a clausula ON onde o
INNER esta para o CROSS assim como o LEFT ou o RIGHT para o OUTER. Isso resulta
em coisas do tipo:
SELECT T.Nome
, CA.Nome
, CA.Gols
FROM time T
CROSS APPLY (SELECT
* FROM jogador
J WHERE J.idTime
= T.idTime) CA
Que tem exatamente o mesmo plano de execução e resultado
disso aqui:
SELECT T.Nome
, J.Nome
, J.Gols
FROM time T
INNER JOIN Jogador J
ON J.idTime = T.idTime
Então o que torna esse cara especial? Em minha opinião e
experiência uma das coisas mais interessantes e com um grande potencial são as
pesquisas com o TOP(n) onde o n tem uma variação de acordo com a regra de negócio
em questão e, ainda mais importante, o fato de você conseguir fazer consultas com
funções que retornam tabelas!
CREATE FUNCTION Exemplo(@id AS int, @n AS INT)
RETURNS TABLE
AS
RETURN
SELECT TOP(@n) *
FROM jogador j
WHERE j.idTime = @id
ORDER BY j.Gols DESC
GO
SELECT *
FROM Time t
CROSS APPLY dbo.Exemplo(t.idTime, CASE WHEN(t.idTime=1) THEN 1 ELSE 2 END)
ORDER BY t.IdTime ASC
Vejam que as possibilidades com esse operador são grandes
porem no dia a dia da “firma” são raros os casos onde ele pode/precisa ser
utilizado.
Aqui tem um artigo que me inspirou a fazer esse post e caso
alguém queira o .SQL com o script completo dos exemplos é só pedir.
Muito bacana brother... estou estudando cross apply pois estou procurando algo para resolver meu problema. ... com um subselect no campo...
ResponderExcluirMuito bom post
ResponderExcluir