Eu estive olhando CROSS / OUTER APPLY
com um colega e estamos lutando para encontrar exemplos da vida real de onde usá-los.
Passei bastante tempo analisando Quando devo usar o Cross Apply sobre a Junção interna? e pesquisando no Google, mas o exemplo principal (apenas) parece bastante bizarro (usando o número de linhas de uma tabela para determinar quantas linhas selecionar em outra tabela).
Eu pensei que este cenário pode se beneficiar de OUTER APPLY
:
Tabela de contatos (contém 1 registro para cada contato) Tabela de entradas de comunicação (pode conter n telefone, fax, e-mail para cada contato)
Porém, usando subconsultas, expressões comuns de tabela, OUTER JOIN
com RANK()
e OUTER APPLY
todos parecem ter o mesmo desempenho. Acho que isso significa que o cenário não é aplicável APPLY
.
Compartilhe alguns exemplos da vida real e ajude a explicar o recurso!
fonte
Respostas:
Alguns usos para
APPLY
são ...1) N principais consultas por grupo (pode ser mais eficiente para algumas cardinalidades)
2) Chamando uma função com valor de tabela para cada linha na consulta externa
3) Reutilizando um Alias de Coluna
4) Desvinculando mais de um grupo de colunas
Assume a estrutura da tabela que viola 1NF ....
Exemplo usando a
VALUES
sintaxe 2008+ .Em 2005
UNION ALL
pode ser usado em seu lugar.fonte
Existem várias situações em que você não pode evitar
CROSS APPLY
ouOUTER APPLY
.Considere que você tem duas tabelas.
TABELA MESTRE
TABELA DE DETALHES
Há muitas situações em que precisamos substituir
INNER JOIN
comCROSS APPLY
.1. Se queremos juntar 2 tabelas de
TOP n
resultados comINNER JOIN
funcionalidadeConsidere se precisamos selecionar
Id
eName
deMaster
e últimas duas datas para cadaId
partirDetails table
.A consulta acima gera o seguinte resultado.
Veja, ele gerou resultados para as duas últimas datas e as duas últimas
Id
e uniu esses registros apenas na consulta externa ativadaId
, o que está errado. Para conseguir isso, precisamos usarCROSS APPLY
.e forma ele resultado seguinte.
Aqui está o trabalho. A consulta interna
CROSS APPLY
pode fazer referência à tabela externa, ondeINNER JOIN
não pode fazer isso (gera erro de compilação). Ao encontrar as duas últimas datas, a união é feita dentroCROSS APPLY
, ou sejaWHERE M.ID=D.ID
,.2. Quando precisamos de
INNER JOIN
funcionalidade usando funções.CROSS APPLY
pode ser usado como um substitutoINNER JOIN
quando precisamos obter resultados daMaster
tabela e afunction
.E aqui está a função
que gerou o seguinte resultado
1. Se queremos juntar 2 tabelas de
TOP n
resultados comLEFT JOIN
funcionalidadeConsidere se precisamos selecionar ID e Nome
Master
e as duas últimas datas para cada ID daDetails
tabela.que forma o seguinte resultado
Isso trará resultados errados, ou seja, trará apenas os dados das duas datas mais recentes da
Details
tabela, independentemente deId
se juntar a nósId
. Portanto, a solução adequada está sendo usadaOUTER APPLY
.que forma o seguinte resultado desejado
2. Quando precisamos de
LEFT JOIN
funcionalidade usandofunctions
.OUTER APPLY
pode ser usado como um substitutoLEFT JOIN
quando precisamos obter resultados daMaster
tabela e afunction
.E a função vai aqui.
que gerou o seguinte resultado
CROSS APPLY
ouOUTER APPLY
pode ser usado para reterNULL
valores ao girar, que são intercambiáveis.Considere que você tem a tabela abaixo
Quando você usa
UNPIVOT
trazerFROMDATE
ANDTODATE
para uma coluna, ele elimina osNULL
valores por padrão.o que gera o resultado abaixo. Observe que perdemos o registro do
Id
número3
Nesses casos, um
CROSS APPLY
ouOUTER APPLY
será útilque forma o resultado a seguir e mantém
Id
onde seu valor é3
fonte
Um exemplo da vida real seria se você tivesse um agendador e quisesse ver qual era a entrada de log mais recente para cada tarefa agendada.
fonte
Para responder ao ponto acima, dê um exemplo:
E agora execute as duas consultas com um plano de execução.
Você pode ver que a consulta de aplicação externa é mais eficiente. (Não foi possível anexar o plano porque sou um novo usuário ... Doh.)
fonte