terça-feira, 7 de agosto de 2012

CROSS APPLY


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.

2 comentários:

  1. Muito bacana brother... estou estudando cross apply pois estou procurando algo para resolver meu problema. ... com um subselect no campo...

    ResponderExcluir