2017-01-15 3 views
1

ich mehrere Tabellen, die ich so angeschlossen haben:JOIN/merge mehrere Tabellen mit demselben Schlüssel

SELECT * 
FROM tableA AS A 
     FULL OUTER JOIN tableB AS B 
        ON B.KEY = A.KEY 
     FULL OUTER JOIN tableC AS C 
        ON C.KEY = A.KEY 
     FULL OUTER JOIN tableD AS D 
        ON D.KEY = A.KEY 

Dies funktioniert gut, aber ich irgendwann getrennte Reihen, wo der Schlüssel nicht in allen Tabellen vorhanden ist.

Beispiel

WITH tableA([KEY], payloadColumn) AS 
(
SELECT 1, 'var_A1' 
), tableB([KEY], payloadColumn) AS 
(
SELECT 2, 'var_B2' 
), tableC([KEY], payloadColumn) AS 
(
SELECT 1, 'var_C1' 
), tableD([KEY], payloadColumn) AS 
(
SELECT 2, 'var_D2' 
) 
SELECT * FROM tableA as A 
FULL OUTER JOIN tableB as B ON B.[KEY] = A.[KEY] 
FULL OUTER JOIN tableC as C ON C.[KEY] = A.[KEY] 
FULL OUTER JOIN tableD as D ON D.[KEY] = A.[KEY] 

Returns

+------+---------------+------+---------------+------+---------------+------+---------------+ 
| KEY | payloadColumn | KEY | payloadColumn | KEY | payloadColumn | KEY | payloadColumn | 
+------+---------------+------+---------------+------+---------------+------+---------------+ 
| 1 | var_A1  | NULL | NULL   | 1 | var_C1  | NULL | NULL   | 
| NULL | NULL   | 2 | var_B2  | NULL | NULL   | NULL | NULL   | 
| NULL | NULL   | NULL | NULL   | NULL | NULL   | 2 | var_D2  | 
+------+---------------+------+---------------+------+---------------+------+---------------+ 

Aber ich brauche sie alle in der Folge in der gleichen Zeile zu sein (nicht zwei Reihen für 2). Wie kann ich das machen?

+0

Das Erhalten eines 'NULL' mit einem' FULL JOIN' bedeutet, dass es * keine * Zeile gibt, die den Einschränkungen in 'JOIN' entspricht. Das ist die Definition eines 'FULL JOIN'. Wenn Sie stattdessen Zeilen ohne Übereinstimmung ausfiltern möchten, verwenden Sie einen 'INNER JOIN'. – jpmc26

+0

Schnellgedanke: Erstellen Sie eine Ansicht, die eine Union aller Nicht-Null-Schlüssel aller vier Tabellen ist, verwenden Sie dann diese Ansicht als primäre ('FROM') Tabelle in Ihrer Hauptabfrage, und linken Sie die Nutzlast – dlatikay

+0

@ jpmc26 - das ist nicht, was sie fragen. –

Antwort

3

Das ist meine vorgeschlagene Lösung zu dem Entwurf in einer früheren Version von OP und ihre zuletzt basiert:

CREATE VIEW ABCD 

AS 

SELECT [KEY] FROM tableA 
UNION 
SELECT [KEY] FROM tableB 
UNION 
SELECT [KEY] FROM tableC 
UNION 
SELECT [KEY] FROM tableD 

Erstellen einer Ansicht kann keine Option sein; In diesem Fall schreiben Sie es als CTE um. Mindestens auf diese Weise verwendet der Ausführungsplan weiterhin Indizes (angenommen [KEY] ist eine PK oder indiziert).

Wenn dies Ihre Idee falsch verstanden hat, bitte erarbeiten.

+0

Ich bearbeitet, um die Frage zu klären, und die Nicht-Schlüssel-Spalte (in einem minimalen Beispiel nicht notwendig) ging auf dem Weg verloren. Jetzt wieder hinzugefügt. Also sollte Ihre Antwort damit synchron sein. –

+0

Ich bin sehr dankbar. Es war genau das, was ich brauchte. Danke vielmals – user625079

3

können Sie COALESCE

WITH tableA([KEY], payloadColumn) 
    AS (SELECT 1, 
       'var_A1'), 
    tableB([KEY], payloadColumn) 
    AS (SELECT 2, 
       'var_B2'), 
    tableC([KEY], payloadColumn) 
    AS (SELECT 1, 
       'var_C1'), 
    tableD([KEY], payloadColumn) 
    AS (SELECT 2, 
       'var_D2') 
SELECT COALESCE(A.[KEY], B.[KEY], C.[KEY], D.[KEY]) AS [KEY], 
     A.payloadColumn, 
     B.payloadColumn, 
     C.payloadColumn, 
     D.payloadColumn 
FROM tableA AS A 
     FULL OUTER JOIN tableB AS B 
        ON B.[KEY] = A.[KEY] 
     FULL OUTER JOIN tableC AS C 
        ON C.[KEY] = COALESCE(A.[KEY], B.[KEY]) 
     FULL OUTER JOIN tableD AS D 
        ON D.[KEY] = COALESCE(A.[KEY], B.[KEY], C.[KEY]); 

Returns

+-----+---------------+---------------+---------------+---------------+ 
| KEY | payloadColumn | payloadColumn | payloadColumn | payloadColumn | 
+-----+---------------+---------------+---------------+---------------+ 
| 1 | var_A1  | NULL   | var_C1  | NULL   | 
| 2 | NULL   | var_B2  | NULL   | var_D2  | 
+-----+---------------+---------------+---------------+---------------+ 

verwenden Wenn alle Tabellen für diese einen abdeckenden Index der Ausführungsplan auf [KEY] INCLUDE (payloadColumn) haben nur miteinander verbindet verschmelzen Kette.

enter image description here

+0

Tanks für Ihre Mühe. Ich lief mit dem einen von Dlatikay – user625079

Verwandte Themen