Exemple réel, quand les utiliser à l'EXTÉRIEUR / CROIX APPLIQUER dans SQL
J'ai été à la recherche à CROSS /OUTER APPLY
avec un collègue et nous avons du mal à trouver de la vie réelle des exemples de cas où les utiliser.
J'ai passé beaucoup de temps à regarder Quand dois-je utiliser de la Croix s'Appliquent à la Jointure Interne? et googler mais le principal (seul) exemple semble assez bizarre (en utilisant le nombre de lignes d'une table pour déterminer le nombre de lignes à sélectionner à partir d'une autre table).
J'ai pensé à ce scénario peut bénéficier de OUTER APPLY
:
Table de Contacts (contient 1 enregistrement pour chaque contact)
La Communication des Entrées de la Table (peut contenir n de téléphone, fax, e-mail bof chaque contact)
Mais à l'aide de sous-requêtes, les expressions de table communes, OUTER JOIN
avec RANK()
et OUTER APPLY
semblent tous aussi. Je suppose que cela signifie que le scénario n'est pas applicable aux APPLY
.
Merci de partager quelques exemples concrets et de contribuer à expliquer la fonction!
- "top n " par groupe" ou l'analyse de XML est commun. Voir certaines de mes réponses, stackoverflow.com/...
- mssqltips.com/sqlservertip/1958/...
- explainextended.com/2009/07/16/inner-join-vs-cross-apply
- double possible de Quand dois-je utiliser de la Croix s'Appliquent à la Jointure Interne?
- Consultez ici aussi stackoverflow.com/questions/27838045/where-to-use-outer-apply
Vous devez vous connecter pour publier un commentaire.
Quelques usages pour
APPLY
sont...1) Top N par groupe de requêtes (peut être plus efficace pour certains les cardinalités)
2) l'Appel d'une Fonction à valeur de Table pour chaque ligne de la requête externe
3) La réutilisation d'un alias de colonne
4) Unpivoting plus d'un groupe de colonnes
Suppose 1FN violer structure de la table....
Exemple à l'aide de 2008+
VALUES
syntaxe.En 2005
UNION ALL
peut être utilisé à la place.ROW_NUMBER
peut mettre fin à la recherche à travers une charge de lignes inutiles alors queAPPLY
pouvez juste obtenir leTOP N
ensuite chercher dans le prochain groupe. Voir l'exemple dans le lien de 39 lectures logiques pourAPPLY
comparé avec 28 000 lectures pourROW_NUMBER
Il y a des situations où vous ne pouvez pas éviter
CROSS APPLY
ouOUTER APPLY
.Considérer que vous avez deux tables.
DE LA TABLE DE MAÎTRE
TABLE DÉTAILS
Il y a beaucoup de situation où nous avons besoin de remplacer
INNER JOIN
avecCROSS APPLY
.1. Si nous voulons joindre 2 tables sur
TOP n
résultats avecINNER JOIN
fonctionnalitéExaminer si nous avons besoin de sélectionner
Id
etName
deMaster
et les deux dernières dates pour chaqueId
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 derniers date du
Id
et ensuite joint les documents à l'extérieur de la requête surId
, ce qui est faux. Pour ce faire, nous avons besoin d'utiliserCROSS APPLY
.et des formes, il a le résultat suivant.
Ici, c'est le travail. La requête à l'intérieur
CROSS APPLY
peut faire référence à la table externe, oùINNER JOIN
ne peut pas le faire(jette erreur de compilation). Lors de la recherche de la dernière des deux dates, l'assemblage est fait à l'intérieurCROSS APPLY
c'est à dire,WHERE M.ID=D.ID
.2. Lorsque nous avons besoin de
INNER JOIN
fonctionnalités à l'aide de fonctions.CROSS APPLY
peut être utilisé comme un remplacement avecINNER JOIN
quand nous en avons besoin pour obtenir le résultat deMaster
table et unfunction
.Et voici la fonction
qui a généré les résultats suivants
1. Si nous voulons joindre 2 tables sur
TOP n
résultats avecLEFT JOIN
fonctionnalitéExaminer si nous avons besoin de sélectionner l'Id et le Nom de
Master
et les deux dernières dates pour chaque Id deDetails
table.qui forme le résultat suivant
Cela apportera de mauvais résultats c'est à dire, il ne vous apportera que plus tard deux dates données à partir de
Details
table, indépendamment deId
même si nous nous joignons àId
. Donc, la bonne solution est d'utiliserOUTER APPLY
.qui forme le suivant résultat souhaité
2. Lorsque nous avons besoin de
LEFT JOIN
fonctionnalités à l'aide defunctions
.OUTER APPLY
peut être utilisé comme un remplacement avecLEFT JOIN
quand nous en avons besoin pour obtenir le résultat deMaster
table et unfunction
.Et la fonction passe ici.
qui a généré les résultats suivants
CROSS APPLY
ouOUTER APPLY
peut être utilisé pour conserverNULL
des valeurs lors de l'unpivoting, qui sont interchangeables.Considérer que vous avez le tableau ci-dessous
Lorsque vous utilisez
UNPIVOT
à apporterFROMDATE
ETTODATE
à une colonne, il permettra d'éliminer lesNULL
valeurs par défaut.qui génère le résultat ci-dessous. Notez que nous avons raté le record de
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
Un exemple concret serait si vous aviez un planificateur et je voulais voir ce que le journal le plus récent entrée a été pour chaque tâche planifiée.
Pour répondre à la point au-dessus de frapper un exemple:
Et maintenant exécuter deux requêtes avec un plan d'exécution.
Vous pouvez voir que l'extérieur s'appliquent requête est plus efficace. (Ne pouvait pas joindre le plan que je suis un nouvel utilisateur... Doh.)