2014-10-28 9 views
5

Was ist falsch an diesem einfachen SQL-Outer-Join?Wie kann ein linker äußerer Join B mehr Zeilen zurückgeben als in A?

select count(*) from A -- 25766 
select count(*) from B -- 1242 
select count(*) from A left outer join B on A.b = B.b -- 310176 

Zeilen 25766, 1242 und 310176 Zeilen zurückgeben. (Dies ist für Microsoft SQL Server 2012.) Wie kann A left outer join B je mehr Zeilen zurückgeben, als in A, vor allem gegeben this Venn-Diagramm? Ich schätze, ich mache einen dummen Fehler, aber was ist es?

+2

es, dass die Säule sein kann b ist nicht der ganze Schlüssel? – Jens

+0

+1 Ich werde überprüfen. Wie könnte das 310176 erklären? – Drux

+2

Wenn b nur der Teil des Schlüssels ist, kann es sein, dass eine Zeile in A viel mehr Zeilen in B referenziert und wenn in Ihrem Beispiel 1 Satz von A Verweis 12,0 ... Zeilen in B Sie Ihr Ergebnis erhalten. – Jens

Antwort

14

Dies kann vorkommen, wenn die Spalte b in Tabelle B nicht eindeutig ist. Angenommen, Sie diese Daten haben:

 
    A  B 
+---+ +---+---+ 
| b | | b | c | 
+---+ +---+---+ 
| 1 | | 2 | 1 | 
| 2 | | 2 | 2 | 
+---+ +---+---+ 

Wenn Sie mit der linken beitreten A-B auf Spalte b, erhalten Sie

 
+-----+------+------+ 
| A.b | B.b | B.c | 
+-----+------+------+ 
| 1 | NULL | NULL | 
| 2 | 2 | 1 | 
| 2 | 2 | 2 | 
+-----+------+------+ 

die drei Reihen insgesamt gibt, obwohl beide A und B nur haben jeweils zwei Reihen.

+0

+1 Ja, 'Select count (distinct b) von B' gibt 197, und 197 << 1242 zurück. – Drux

3

Es ist nichts seltsam daran (und diese Situation gilt auch für innere Verbindungen). Eine linke äußere Verknüpfung: Also nicht

Minimum bei der Abfrage

  • Gibt alle Zeilen aus einer Kreuzung B, wo die Bedingung Spiel
  • verbinden und gibt alle Zeilen aus A, in dem Zustand der Verbindung überein wird 25766 Zeilen zurückgeben, aber es könnte mehr geben. Es ist möglich, eine Zeile in Tabelle A zu haben, die viele Zeilen in Tabelle B Beispiel entspricht:

    A    B    Result 
    +----+----+ +-----+----+ +------+-----+-----+------+ 
    | id| b| | id| b| | a.id| a.b| b.b| b.id| 
    +----+----+ +-----+----+ +------+-----+-----+------+ 
    | 1| 10| | 123| 10| |  1| 10| 10| 123| 
    +----+----+ | 456| 10| |  1| 10| 10| 456| 
          +-----+----+ +------+-----+-----+------+ 
    

    Dies gibt zwei Reihen, obwohl es eine Zeile in Tabelle A ist