J'ai regardé CROSS / OUTER APPLY
avec un collègue et nous avons du mal à trouver des exemples concrets où les utiliser.
J'ai passé beaucoup de temps à regarder Quand devrais-je utiliser Cross Apply sur Inner Join? et googler mais l'exemple principal (seul) semble assez bizarre (en utilisant le nombre de lignes d'une table pour déterminer le nombre de lignes à sélectionner dans une autre table).
Je pensais que ce scénario pourrait bénéficier de OUTER APPLY
:
Tableau des contacts (contient 1 enregistrement pour chaque contact) Tableau des entrées de communication (peut contenir n téléphone, fax, e-mail pour chaque contact)
Mais en utilisant des sous-requêtes, des expressions de table communes, OUTER JOIN
avec RANK()
et OUTER APPLY
tous semblent fonctionner de la même manière. Je suppose que cela signifie que le scénario n'est pas applicable APPLY
.
Veuillez partager quelques exemples réels et aider à expliquer la fonctionnalité!
la source
Réponses:
Certaines utilisations
APPLY
sont ...1) Top N par requêtes de groupe (peut être plus efficace pour certaines cardinalités)
2) Appel d'une fonction de table pour chaque ligne de la requête externe
3) Réutilisation d'un alias de colonne
4) Annulation du pivotement de plusieurs groupes de colonnes
Suppose que 1NF viole la structure de table ...
Exemple utilisant la
VALUES
syntaxe 2008+ .En 2005
UNION ALL
peut être utilisé à la place.la source
Il existe diverses situations où vous ne pouvez pas éviter
CROSS APPLY
ouOUTER APPLY
.Considérez que vous avez deux tables.
TABLE DE MAÎTRE
TABLEAU DE DÉTAILS
Il y a beaucoup de situations où nous devons remplacer
INNER JOIN
avecCROSS APPLY
.1. Si nous voulons joindre 2 tables sur les
TOP n
résultats avec desINNER JOIN
fonctionnalitésConsidérez si nous devons sélectionner
Id
etName
deMaster
et deux dernières dates pour chacuneId
deDetails table
.La requête ci-dessus génère le résultat suivant.
Voir, il a généré des résultats pour les deux dernières dates avec les deux dernières dates,
Id
puis a joint ces enregistrements uniquement dans une requête externeId
, ce qui est faux. Pour ce faire, nous devons utiliserCROSS APPLY
.et forme le résultat suivant.
Voici le travail. La requête à l'intérieur
CROSS APPLY
peut référencer la table externe, oùINNER JOIN
cela ne peut pas faire (génère une erreur de compilation). Lors de la recherche des deux dernières dates, la jonction se fait à l'intérieur,CROSS APPLY
c'est- à- direWHERE M.ID=D.ID
.2. Lorsque nous avons besoin de
INNER JOIN
fonctionnalités utilisant des fonctions.CROSS APPLY
peut être utilisé en remplacementINNER JOIN
lorsque nous devons obtenir le résultat de laMaster
table et afunction
.Et voici la fonction
qui a généré le résultat suivant
1. Si nous voulons joindre 2 tables sur les
TOP n
résultats avec desLEFT JOIN
fonctionnalitésConsidérez si nous devons sélectionner l'ID et le nom à partir de
Master
et les deux dernières dates pour chaque ID de laDetails
table.ce qui forme le résultat suivant
Cela entraînera des résultats erronés, c'est-à-dire qu'il n'apportera que les données des deux dernières dates de la
Details
table,Id
même si nous nous joignonsId
. Donc, la bonne solution utiliseOUTER APPLY
.qui forme le résultat souhaité suivant
2. Lorsque nous avons besoin de
LEFT JOIN
fonctionnalités en utilisantfunctions
.OUTER APPLY
peut être utilisé en remplacementLEFT JOIN
lorsque nous devons obtenir le résultat de laMaster
table et afunction
.Et la fonction va ici.
qui a généré le résultat suivant
CROSS APPLY
ouOUTER APPLY
peut être utilisé pour conserver lesNULL
valeurs lors du non-pivotement, qui sont interchangeables.Considérez que vous avez le tableau ci-dessous
Lorsque vous utilisez
UNPIVOT
pour amenerFROMDATE
ANDTODATE
à une colonne, il éliminera lesNULL
valeurs par défaut.qui génère le résultat ci-dessous. Notez que nous avons raté le record du
Id
nombre3
Dans de tels cas, un
CROSS APPLY
ouOUTER APPLY
sera utilequi forme le résultat suivant et conserve
Id
où sa valeur est3
la source
Un exemple concret serait si vous aviez un planificateur et que vous vouliez voir quelle était l'entrée de journal la plus récente pour chaque tâche planifiée.
la source
Pour répondre au point ci-dessus, donnez un exemple:
Et maintenant, exécutez les deux requêtes avec un plan d'exécution.
Vous pouvez voir que la requête d'application externe est plus efficace. (Impossible de joindre le plan car je suis un nouvel utilisateur ... Doh.)
la source