Ich arbeite mit zwei Datensätzen, die ich über einen Join-Befehl (keine Union) kombinieren möchte.

Ich glaube nicht, dass ich die Grundlagen des Beitritts verstehe. Ich habe einen Full Outer Join wie folgt verwendet:

    Select
      Table1.col1,
      Table1.col2, 
      Table1.date1,
      Table2.col1,
      Table2.col2,
      Table2.date2
   From Table1 full outer join 
        Table2 On Table1.date1 = Table2.date2

Der endgültige kombinierte Datensatz hatte eine Gesamtzahl von Zeilen, die größer war als die Summe der Zeilen in Tabelle 1 und Tabelle 2.

Ich versuche zu verstehen, warum das passieren würde.

Ich hatte den Eindruck, dass (# Zeilen in CombinedTable) = (# Zeilen in Tabelle1) + (# Zeilen in Tabelle2).

Warum tritt das auf? Wie kann ich das beheben?

0
K.Doe 23 Feb. 2020 im 10:28

3 Antworten

Beste Antwort

Überprüfen Sie dies heraus:

TblJob
Name, Surname, Job
John, White, Developer
John, Black, Tester
John, Grey, Manager

TblDrinksPref
Name, Surname, Drink
John, White, Coffee
John, Black, Tea
John, Grey, Orange Juice

SELECT * FROM tbljob j JOIN tbldrinkspref p ON j.name = p.name

John, White, Developer, John, White, Coffee
John, White, Developer, John, Black, Tea
John, White, Developer, John, Grey, Orange Juice
John, Black, Tester, John, White, Coffee
John, Black, Tester, John, Black, Tea
John, Black, Tester, John, Grey, Orange Juice
John, Grey, Manager, John, White, Coffee
John, Grey, Manager, John, Black, Tea
John, Grey, Manager, John, Grey, Orange Juice

Wenn Sie nur den Vornamen eingeben, stimmt jede Zeile in jeder Tabelle mit der anderen überein. 3 Zeilen in jeder Tabelle führen zu einer Ausgabe von 3x3 Tabellen. mehr als die Summe der Zeilen. Die meisten Zeilen, die Sie aus einem Join herausholen, sind die Multiplikationen der Anzahl der Zeilen, die in den Join geleitet werden. Wir nennen dies ein kartesisches Produkt und es ist normalerweise ein Hinweis darauf, dass Ihre SQL-Joins einen Fehler aufweisen. Jeder Join kann dies tun, nicht nur äußere. Es gibt einen Join (CROSS JOIN genannt), dessen einziger Zweck darin besteht, eine Ausgabe zu erstellen, die ein perfektes kartesisches Produkt darstellt, da wir dies manchmal tun möchten, dies jedoch meistens auf ein Problem hinweist

Was können Sie dagegen tun? Verbinden Sie keine Zeilen mit Zeilen, die nichts miteinander zu tun haben, indem Sie Ihre Verknüpfungsbedingungen verbessern / genauer machen:

SELECT * 
FROM tbljob j JOIN tbldrinkspref p 
ON j.name = p.name 
  --the last name is vital to associate rows correctly in this case
  AND j.surname = p.surname

Wenn Sie eine große SQL geschrieben haben und bestimmte Zeilen unerwartet dupliziert werden, bedeutet dies, dass einer Ihrer Joins fehlerhaft ist. Kommentieren Sie sie alle nur in der ersten Tabelle aus, kommentieren Sie den Auswahlblock und führen Sie die SQL erneut aus, während Sie Joins wieder hinzufügen. Wenn Sie sehen, dass die Zeilenanzahl unerwartet zunimmt, ist dies möglicherweise der Fehler, aber beachten Sie, dass ein Join Zeilen verursachen kann Auch verschwinden, und Sie befinden sich möglicherweise in einer Situation, in der das Hinzufügen eines Joins dazu führen kann, dass die Hälfte der Zeilen verschwindet, weil sie nicht mit dem Join-Prädikat übereinstimmen, die andere Hälfte der Zeilen jedoch verdoppelt wird, weil der Join fehlerhaft ist. Sie müssen die Daten berücksichtigen, die Sie verbinden, wenn Sie beurteilen, wie sich die Zeilenanzahl aufgrund des Hinzufügens einer Tabelle ändern soll, im Vergleich dazu, wie sie sich tatsächlich ändert

1
Caius Jard 23 Feb. 2020 im 08:22

Betrachten Sie zwei Tabellen A mit m Zeilen und B mit n Zeilen und eine Abfrage wie diese:

select count(*)
from a full join
     b
     on <some condition>;

Diese Zeile kann (fast) eine beliebige Zahl zwischen greatest(n, m) und n * m zurückgeben.

Es würde greatest(n, m) zurückgeben, wenn die Bedingung immer 1 zu 1 wäre (z. B. bei IDs).

Es würde n + m zurückgeben, wenn die Bedingung immer als FALSE ausgewertet wird.

Es würde n * m zurückgeben, wenn die Bedingung immer mit TRUE bewertet würde.

Mit wenigen Ausnahmen kann fast jede Zahl dazwischen zurückgegeben werden (zum Beispiel ist es in vielen Fällen schwierig, n * m - 1 Zeilen zu erhalten).

Im Gegensatz dazu könnte ein INNER JOIN zwischen 0 und n * m Zeilen zurückkehren.

Andererseits gibt UNION ALL immer genau die Summe der Zeilen in den beiden Tabellen zurück, sodass Sie möglicherweise UNION ALL und FULL JOIN verwechseln.

0
Gordon Linoff 23 Feb. 2020 im 13:21

Sie erhalten N Beispiele und Diagramme. Sie sollten sich mit Verknüpfungen vertraut machen, bevor Sie sich diese Beispiele und Diagramme ansehen. Ich gehe davon aus, dass Sie MS SQL verwenden.

Die vollständige äußere Verknüpfung gibt eine Ergebnismenge zurück, die Zeilen aus der linken und rechten Tabelle enthält. Wenn Sie also 3 Zeilen in der ersten Tabelle und 5 Zeilen in der zweiten Tabelle haben, müssen es nicht nur 8 Zeilen sein. Dies hängt auch davon ab, wie der Fremdschlüsselwert zwischen diesen beiden Tabellen verwendet wird.

Wenn der Wert aus der zweiten Tabelle nicht den Spaltenwerten der ersten Tabelle zugeordnet ist, werden diese als null zurückgegeben.

Wie von @Caius Jard erwähnt, erhöhen sich die Rückgabewerte basierend auf dem zugeordneten Wert. Hoffe es hilft ein bisschen für dich.

PS Full Join und Full Outer Join sind gleich!

1
Manjuboyz 23 Feb. 2020 im 08:18