2016-03-19 4 views
0

Warum werden immer Duplikate mit T-SQL FULL OUTER JOIN mit mehr als 2 Tabellen erstellt, wenn die erste Tabelle (die FROM-Tabelle) keinen Schlüsselwert hat, den mindestens zwei andere Tabellen haben?Warum werden Duplikate mit vollständigem Outer Join mit mehr als 3 Tabellen erstellt?

create table x(a int) 
create table y(a int) 
create table z(a int) 

INSERT INTO x values (0); 
INSERT INTO y values (1); 
INSERT INTO z values (1); 

SELECT x_a=x.a, y_a=y.a, z_a=z.a, a=coalesce(x.a,y.a,z.a) 
FROM x as x 
FULL JOIN y as y 
ON y.a=x.a 
FULL JOIN z as z 
ON z.a=x.a 
ORDER BY a 

yeilds:

x_a  y_a z_a a 
0   NULL NULL 0 
NULL  1  NULL 1 
NULL  NULL 1 1 

Damit haben wir doppelte Schlüsselwerte, die nicht das, was ich erwarte, oder das, was Sie erhalten würden, wenn Sie die Tabellen verknüpft nacheinander oder um zwei Jahre. In diesem Fall ist FULL JOIN nicht wirklich assoziativ oder kommunikativ.

Gibt es eine Möglichkeit, dies auf eine programmatisch effiziente Weise zu lösen?

+1

Ich verstehe Ihre Frage nicht:/ –

+3

Also was ist Ihr erwartetes Ergebnis? – Squirrel

Antwort

1

Mal sehen. Wenn Sie laufen:

SELECT x_a = x.a, y_a = y.a, a=coalesce(x.a, y.a) 
FROM x as x FULL JOIN 
    y as y 
    ON y.a = x.a; 

Sie werden zwei Reihen bekommen, weil y.a nicht gleich x.a ist und FULL JOIN hält alle Zeilen in beiden Tabellen auch ohne Spiel. Die Spalten der nicht übereinstimmenden Tabelle sind alle NULL.

Die Zeilen werden:

x_a y_a a 
0  NULL 0 
NULL 1  1 

Das ist, was passiert, wenn die ON Bedingung für eine FULL JOIN falsch ist.

Wenn dies mit z wiederholt wird, erhalten Sie drei Zeilen, weil die ON Bedingung auch falsch ist.

Die Ergebnisse ergeben für mich vollkommen Sinn.

+0

Kannst du mir genau sagen, was du meinst, wenn du sagst "wenn das mit z wiederholt wird"? Wenn Sie zuerst x und y verbinden und das Ergebnis nehmen und es mit z verbinden, erhalten Sie zwei Zeilen in der endgültigen Ausgabe.

Wenn Sie die Vereinigung der zwei getrennten Schritte nehmen, erhalten Sie natürlich 4 Reihen.

Ich habe wirklich keine Ahnung, was SQL hier tut. –

+0

@ JohnSmith. . . Wenn Sie 'full join' verwenden und die Bedingung zu false oder' NULL' auswertet, erhalten Sie Zeilen aus * beiden * -Tabellen. –