2016-05-23 19 views
1

Ich muss Ergebnisse für eine Zeile anzeigen können, die tatsächlich in einer zweiten Tabelle nicht vorhanden ist. Ich habe versucht, links beizutreten, aber es scheint nicht zu funktionieren, was ich tun muss. Ich habe 2 Tabellen, zum Beispiel:SQL | Left Join, wenn die zweite Tabelle keine übereinstimmende Zeile enthält?

Table1 
NAME | KEY 
John 12345 
Frank 23456 

Table2 
KEY | LIST | STATUS 
12345 10001 1 
12345 10003 0 
23456 10001 1 
23456 10002 1 

Ich muss in der Lage sein, die Ergebnisse wie folgt zu zeigen:

NAME | KEY | LIST | STATUS 
John 12345 10001 1 
John 12345 10002 (null) 
John 12345 10003 0 
Frank 23456 10001 1 
Frank 23456 10002 1 
Frank 23456 10003 (null) 

Aber ich kann nicht herausfinden, wie dies zu tun, weil die Datensätze, die zurückkehren In der zweiten Tabelle existiert kein Nullwert. Wenn ich sie einzeln leite, kann ich irgendwie die Ergebnisse erzielen, die ich benötige, indem ich UNION ALL tue, aber das ist nicht effizient (ich musste auch meine Ergebnisse neu ordnen, was es auch schwieriger macht)

Dies ist auch keine ideale Lösung, weil ich den Rest der Listen ziehe, aber die anderen Felder sind null, also muss ich sie manuell einfügen, wenn ich meine Ergebnisse nach Excel verschiebe.

Irgendwelche Ideen? Ich dachte wirklich, dass ich das mit einer linken Verbindung machen könnte, aber nichts, was ich tue, scheint zu funktionieren.

+0

Welche Version von SQL verwenden Sie? –

Antwort

0

FULL OUTER JOIN Versuchen

Beispiel:

SELECT A.NAME, A.KEY, A.LIST, B.STATUS 
FROM Table1 A 
FULL OUTER JOIN Table2 B 
ON A.KEY = B.KEY AND A.LIST = B.LIST 

Wenn nicht wollen Zeilen der zweiten Tabelle, dass sie in der ersten Tabelle fügen Sie den Zustand keine Referenz haben:

WHERE A.KEY IS NOT NULL 
3

Verwenden Sie eine cross join, um alle Zeilen zu erhalten. Dann verwenden Sie left join, um die vorhandenen Werte einzubringen:

select t1.key, l.list, t2.status 
from table1 t1 cross join 
    (select distinct list from table2) l left join 
    table2 t2 
    on t1.key = t2.key and t1.list = t2.list; 
+0

Ich habe Ihnen eine Anregung gegeben, aber können Sie ein wenig mehr erklären, was und warum Sie tun. – Alex

+0

Der erste Satz ist die Zusammenfassung. . . Der 'cross join' erzeugt alle gewünschten Zeilen, eine für jede' list' und jede 'key'. Der 'linke Join' bringt dann die Daten aus der Tabelle. –

0

Hier ist, was ich gefunden habe. Die ersten zwei Abfragen werden verwendet, um alle möglichen Kombinationen von NAME, KEY und LIST zusammen zu bekommen. Die letzte Abfrage wird wieder mit Table2 verknüpft, um STATUS zu erhalten, wobei NULL zurückgegeben wird, wenn STATUS nicht existiert.

;WITH Lists 
AS 
(
    SELECT DISTINCT LIST 
    FROM Table2 
), 
KeyList AS 
(
    SELECT [NAME], [KEY], [LIST] 
    FROM Lists CROSS JOIN Table1 
) 
SELECT a.[NAME], a.[KEY],A.[LIST],b.[STATUS] 
FROM KeyList a 
LEFT JOIN Table2 b 
ON a.[KEY] = b.[KEY] 
AND a.[LIST] = b.[LIST]