Ich versuche, alle von einem gegebenen Lehrer gelehrten mittleren / höheren Kurse zurückzugeben. Bei einem inneren Join zweier Tabellen werden 3 Zeilen korrekt angezeigt. Wenn ich 2. innere Verbindung mit der 3. Tabelle mache, gibt es 6 Reihen statt 3 zurück.
Ohne cte, DISTINCT, wie kann ich drei Zeilen mit empid, den Mittelklassen und den High-School-Klassen anzeigen? Außerdem sollten beide Fremdtabellen Joins mit der Primärtabelle ausführen.
%Vor%Es könnte eine elegantere Lösung geben, aber dies sollte für das gegebene Szenario genügen:
%Vor%Zunächst müssen Sie verstehen, wie innerer Join funktioniert. Innerer Join Du bekommst den Datensatz, der in beiden Tabellen vorhanden ist treten ein.
kommt zu Ihrer Frage, wenn Sie die folgende Abfrage ausführen
%Vor%Sie werden diesen Datensatz bekommen.
%Vor%Sie erhalten also 3 Datensätze, was erwartet wird, da es 3 Einträge in #middlecourse -Tabelle mit empid = 1 gibt. So ist der innere Join wie folgt. Es wird jeweils ein Empid aus der #empl-Tabelle ausgewählt und versucht, die passenden Zeilen für dieses Empid in der zweiten Tabelle zu finden, d. H. #Middlecourses
Sie haben also 3 Datensätze von oben Abfrage. Wenn Sie jetzt den zweiten inneren Join hinzufügen, wird er versuchen, Empid von über 3 record zu erhalten und wird mit der dritten Tabelle übereinstimmen, die #highcoures ist. Also wird es für jedes Empid 3 Record zurückgeben. so total haben Sie 3 * 3 = 9 Datensatz von zweiten Abfrage wie folgt.
%Vor%Eine Lösung für dieses Szenario wäre die Vereinigung in Ihrer Kurstabelle und dann die innere Verknüpfung mit der Tabelle #empl.
%Vor% Dies liegt daran, dass all Ihre empid
und grade
identisch sind. Dieser Join passt viele Male zusammen.
Sie sehen dies bereits in Ihrem ersten Join, die Zeilen in #Empl
werden dreimal dupliziert (weil sie mit allen 3 Datensätzen in #MiddleCourses
übereinstimmen).
Um diese zu reduzieren, müssen Sie eine exklusivere Verknüpfung verwenden und / oder andere Daten verwenden. Versuchen Sie, die empid
und grade
zu ändern und Sie werden hoffentlich sehen, was ich meine.
Sie können ROW_NUMBER()
verwenden, um middlecourses
mit highcourses
abhängig von alphabetischer course
ordering:
Ausgabe:
%Vor% Das obige funktioniert nur, wenn die gleiche Anzahl von middlecourses
und highcourses
vorhanden ist.
Falls die Anzahl von middlecourses
und highcourses
nicht übereinstimmt, können Sie eine etwas kompliziertere Variante der obigen Abfrage verwenden:
Mit einem weiteren Datensatz in highcourses
:
Ausgabe ist:
%Vor%Tags und Links sql sql-server tsql