TSQL-Abfrage, die zweimal die Zeilen mit innerem Join derselben Tabelle zweimal zurückgibt

9

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%     
rbhat 17.04.2015, 14:28
quelle

5 Antworten

1

Es könnte eine elegantere Lösung geben, aber dies sollte für das gegebene Szenario genügen:

%Vor%     
jorgesalvador 17.04.2015 14:49
quelle
1
  

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%     
Mukund 17.04.2015 14:54
quelle
0

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.

    
m.edmondson 17.04.2015 14:35
quelle
0

Ja, edmondson hat Recht. Was Sie tun könnten, ist ein einfacher Pivot mit einer ROW_NUMBER (), um die Zeilen eindeutig zu machen.

%Vor%     
Joeri 17.04.2015 14:45
quelle
0

Sie können ROW_NUMBER() verwenden, um middlecourses mit highcourses abhängig von alphabetischer course ordering:

abzugleichen %Vor%

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:

%Vor%

Mit einem weiteren Datensatz in highcourses :

%Vor%

Ausgabe ist:

%Vor%     
Giorgos Betsos 17.04.2015 14:42
quelle

Tags und Links