Ich habe CROSS / OUTER APPLY
mit einem Kollegen nachgesehen und wir bemühen uns, Beispiele aus der Praxis zu finden, wo wir sie verwenden können.
Ich habe ziemlich viel Zeit damit verbracht, zu prüfen, wann ich Cross Apply über Inner Join verwenden soll. und googeln, aber das Hauptbeispiel (nur) scheint ziemlich bizarr zu sein (mithilfe der Zeilenanzahl aus einer Tabelle zu bestimmen, wie viele Zeilen aus einer anderen Tabelle ausgewählt werden sollen).
Ich dachte, dieses Szenario könnte profitieren von OUTER APPLY
:
Kontakttabelle (enthält 1 Datensatz für jeden Kontakt) Tabelle der Kommunikationseinträge (kann n Telefon, Fax, E-Mail für jeden Kontakt enthalten)
Bei Verwendung von Unterabfragen scheinen allgemeine Tabellenausdrücke OUTER JOIN
mit RANK()
und OUTER APPLY
alle gleich zu funktionieren . Ich vermute, dies bedeutet, dass das Szenario nicht anwendbar ist APPLY
.
Bitte teilen Sie einige Beispiele aus dem wirklichen Leben mit und erklären Sie die Funktion!
quelle
Antworten:
Einige Anwendungen für
APPLY
sind ...1) Top N pro Gruppenabfragen (kann für einige Kardinalitäten effizienter sein)
2) Aufrufen einer Tabellenwertfunktion für jede Zeile in der äußeren Abfrage
3) Wiederverwenden eines Spaltenalias
4) Nicht mehr als eine Gruppe von Spalten schwenken
Nimmt an, dass 1NF die Tabellenstruktur verletzt ....
Beispiel mit der
VALUES
Syntax 2008+ .Im Jahr 2005
UNION ALL
kann stattdessen verwendet werden.quelle
Es gibt verschiedene Situationen , in denen man nicht vermeiden kann
CROSS APPLY
oderOUTER APPLY
.Angenommen, Sie haben zwei Tabellen.
MASTER TABLE
DETAILS TABELLE
Es gibt viele Situation , wo wir ersetzen müssen
INNER JOIN
mitCROSS APPLY
.1. Wenn wir 2 Tabellen zu
TOP n
Ergebnissen mit verbinden möchtenINNER JOIN
FunktionalitätÜberlegen Sie, ob wir müssen wählen
Id
undName
ausMaster
und die letzten beiden Tage , für jedenId
ausDetails table
.Die obige Abfrage generiert das folgende Ergebnis.
Es wurden Ergebnisse für die letzten beiden Daten mit den letzten beiden Daten generiert
Id
und diese Datensätze dann nur in der äußeren Abfrage am verknüpftId
, was falsch ist. Um dies zu erreichen, müssen wir verwendenCROSS APPLY
.und bildet er folgendes Ergebnis.
Hier ist die Arbeit. Die Abfrage im Inneren
CROSS APPLY
kann auf die äußere Tabelle verweisen, woINNER JOIN
dies nicht möglich ist (löst einen Kompilierungsfehler aus). Wenn Sie die letzten beiden Daten gefunden haben, erfolgt der Beitritt innerhalb von,CROSS APPLY
dhWHERE M.ID=D.ID
.2. Wenn wir
INNER JOIN
Funktionalität mit Funktionen benötigen .CROSS APPLY
kann als Ersatz verwendet werden,INNER JOIN
wenn wir Ergebnisse ausMaster
Tabelle und a erhalten müssenfunction
.Und hier ist die Funktion
welches das folgende Ergebnis erzeugte
1. Wenn wir 2 Tabellen zu
TOP n
Ergebnissen mit verbinden möchtenLEFT JOIN
FunktionalitätÜberlegen Sie, ob wir ID und Name aus
Master
und die letzten beiden Daten für jede ID aus derDetails
Tabelle auswählen müssen .welches das folgende Ergebnis bildet
Dies führt zu falschen Ergebnissen, dh es werden nur die Daten der letzten beiden Daten aus der
Details
Tabelle angezeigt, unabhängig davonId
, ob wir uns anschließen oder nichtId
. Die richtige Lösung ist alsoOUTER APPLY
.welches das folgende gewünschte Ergebnis bildet
2. Wenn wir
LEFT JOIN
Funktionalität mit benötigenfunctions
.OUTER APPLY
kann als Ersatz verwendet werden,LEFT JOIN
wenn wir Ergebnisse ausMaster
Tabelle und a erhalten müssenfunction
.Und die Funktion geht hier.
welches das folgende Ergebnis erzeugte
CROSS APPLY
oderOUTER APPLY
kann verwendet werden, umNULL
beim Schwenken Werte beizubehalten, die austauschbar sind.Angenommen, Sie haben die folgende Tabelle
Wenn Sie
UNPIVOT
bringenFROMDATE
undTODATE
zu einer Spalte, wird es beseitigenNULL
Werte standardmäßig.Dies erzeugt das folgende Ergebnis. Beachten Sie, dass wir den Datensatz der
Id
Nummer verpasst haben3
In solchen Fällen ist ein
CROSS APPLY
oderOUTER APPLY
nützlichDies bildet das folgende Ergebnis und behält bei,
Id
wo sein Wert ist3
quelle
Ein Beispiel aus dem wirklichen Leben wäre, wenn Sie einen Planer hätten und sehen möchten, was der letzte Protokolleintrag für jede geplante Aufgabe ist.
quelle
Um den obigen Punkt zu beantworten, schlagen Sie ein Beispiel vor:
Führen Sie nun die beiden Abfragen mit einem Ausführungsplan aus.
Sie können sehen, dass die äußere Anwendungsabfrage effizienter ist. (Der Plan konnte nicht angehängt werden, da ich ein neuer Benutzer bin ... Doh.)
quelle