Beispiel für ein echtes Leben, wenn OUTER / CROSS APPLY in SQL verwendet werden soll
Schaue ich CROSS /OUTER APPLY
mit einem Kollegen und wir kämpfen, um zu finden, Beispiele aus dem wirklichen Leben, wo Sie zu nutzen.
Hab ich verbrachte ziemlich viel Zeit mit der Suche an Wann sollte ich verwenden, Cross Apply-über Inner Join? und googeln, aber die wichtigste (einzige) Beispiel scheint ziemlich Bizarr (mit der Zeilenanzahl einer Tabelle bestimmen, wie viele Zeilen wählen Sie aus einer anderen Tabelle).
Dachte ich, dass dieses Szenario profitieren können OUTER APPLY
:
Contacts-Tabelle (enthält 1 Eintrag für jeden Kontakt)
Kommunikation Tabelle Einträge (enthalten kann, n Telefon, fax, E-Mail-fro pro Kontakt)
Aber die Verwendung von Unterabfragen, häufige Tabellenausdrücke, OUTER JOIN
mit RANK()
und OUTER APPLY
alle scheinen zu führen ebenso. Ich vermute, dies bedeutet, das Szenario ist nicht anwendbar auf APPLY
.
Bitte teilen Sie einige Beispiele und erläutern Sie die Funktion!
InformationsquelleAutor der Frage Lee Tickett | 2012-02-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einige Anwendungen für
APPLY
sind...1) Top N per group Abfragen (kann es effizienter sein, für einige kardinalitäten)
2) Aufruf einer Tabellenwertfunktion für jede Zeile der äußeren Abfrage
3) Die Wiederverwendung einer Spalte alias
4) Unpivoting mehr als eine Gruppe von Spalten
Übernimmt 1NF gegen die Struktur einer Tabelle....
Beispiel mit 2008+
VALUES
syntax.2005
UNION ALL
können stattdessen verwendet werden.InformationsquelleAutor der Antwort Martin Smith
Es gibt verschiedene Situationen, wo Sie nicht vermeiden können
CROSS APPLY
oderOUTER APPLY
.Überlegen, Sie haben zwei Tabellen.
MASTER-TABELLE
DETAILS TABELLE
Gibt es viele situation, wo wir brauchen, um zu ersetzen
INNER JOIN
mitCROSS APPLY
.1. Wenn wir wollen zu join 2 Tabellen auf
TOP n
Ergebnisse mitINNER JOIN
FunktionalitätBetrachten, wenn wir auswählen müssen, um
Id
undName
ausMaster
und die letzten beiden Terminen für jedeId
ausDetails table
.Die oben stehende Abfrage generiert das folgende Ergebnis.
Sehen, erzeugt es Ergebnisse für die letzten beiden Termine mit den letzten beiden Datum ' s
Id
und dann kam diese Datensätze nur in der äußeren Abfrage aufId
die falsch ist. Um dies zu erreichen, müssen wir mitCROSS APPLY
.und Formen, die er zu folgendem Ergebnis.
Hier ist die Arbeit. Die Abfrage in
CROSS APPLY
verweisen können, die outer-Tabelle, woINNER JOIN
dies nicht tun(wirft compile-Fehler). Bei der Suche nach den letzten zwei dates, der Beitritt erfolgt innerhalbCROSS APPLY
dhWHERE M.ID=D.ID
.2. Wenn wir Sie brauchen
INNER JOIN
Funktionalität mit Funktionen.CROSS APPLY
können als Ersatz verwendet werden mitINNER JOIN
wenn wir brauchen, um Ergebnis ausMaster
Tisch und einfunction
.Und hier ist die Funktion
generiert das folgende Ergebnis
1. Wenn wir wollen zu join 2 Tabellen auf
TOP n
Ergebnisse mitLEFT JOIN
FunktionalitätBetrachten, wenn wir auswählen müssen, um die Id und den Namen aus
Master
und die letzten beiden Terminen für jede Id ausDetails
Tabelle.welche Formen das folgende Ergebnis
Dieser bringt falsche Ergebnisse, dh, es wird nur die Letzte zwei Termine Daten aus
Details
Tabelle unabhängig vonId
obwohl wir gemeinsam mitId
. So die richtige Lösung istOUTER APPLY
.welche Formen Sie die folgenden gewünschten Ergebnis
2. Wenn wir Sie brauchen
LEFT JOIN
Funktionalität mitfunctions
.OUTER APPLY
können als Ersatz verwendet werden mitLEFT JOIN
wenn wir brauchen, um Ergebnis ausMaster
Tisch und einfunction
.Und die Funktion geht hier.
generiert das folgende Ergebnis
CROSS APPLY
oderOUTER APPLY
können sein verwendet, um behaltenNULL
Werte, wenn unpivoting, die austauschbar sind.Betrachten Sie die unten stehende Tabelle
Wenn Sie
UNPIVOT
zu bringenFROMDATE
UNDTODATE
auf eine Spalte, es beseitigtNULL
Werte standardmäßig.generiert das unten führen. Beachten Sie, dass wir verpasst haben, die Aufzeichnung der
Id
Anzahl3
In solchen Fällen eine
CROSS APPLY
oderOUTER APPLY
wird nützlich sein,welche Formen das folgende Ergebnis und behält
Id
wo Ihr Wert ist3
InformationsquelleAutor der Antwort Sarath Avanavu
Einem real-life Beispiel wäre, wenn Sie hatte einen scheduler und wollte sehen, was die letzten log-Eintrag für jede geplante task.
InformationsquelleAutor der Antwort BJury
Antwort auf die weiter oben klopfen ein Beispiel:
Und führen Sie nun die beiden Abfragen mit einem Ausführungsplan.
Können Sie sehen, dass die äußeren gelten die Abfrage effizienter zu gestalten. (Konnte es nicht Anhängen, das der plan ich bin ein neuer Benutzer... Doh.)
InformationsquelleAutor der Antwort BJury