Fügen Sie mehrere Tabellen in denselben Spalten vollständig hinzu
Ich habe vier Tabellen:
╔═══╦════╗ ╔═══╦════╗ ╔═══╦════╗ ╔═══╦════╗
║ K ║ V1 ║ ║ K ║ V2 ║ ║ K ║ V3 ║ ║ K ║ V4 ║
╠═══╬════╣ ╠═══╬════╣ ╠═══╬════╣ ╠═══╬════╣
║ A ║ 1 ║ ║ B ║ 2 ║ ║ B ║ 3 ║ ║ C ║ 6 ║
║ C ║ 4 ║ ║ D ║ 7 ║ ║ C ║ 5 ║ ║ D ║ 8 ║
╚═══╩════╝ ╚═══╩════╝ ╚═══╩════╝ ╚═══╩════╝
Ich brauche, um Sie zu vereinigen, der durch die Spalte K und wählen Sie V1, V2, V3 und V4:
╔═══╦══════╦══════╦══════╦══════╗
║ K ║ V1 ║ V2 ║ V3 ║ V4 ║
╠═══╬══════╬══════╬══════╬══════╣
║ A ║ 1 ║ NULL ║ NULL ║ NULL ║
║ B ║ NULL ║ 2 ║ 3 ║ NULL ║
║ C ║ 4 ║ NULL ║ 5 ║ 6 ║
║ D ║ NULL ║ 7 ║ NULL ║ 8 ║
╚═══╩══════╩══════╩══════╩══════╝
Einen Weg, das zu lösen ist:
DECLARE @T1 TABLE (K VARCHAR(1), V1 INT);
DECLARE @T2 TABLE (K VARCHAR(1), V2 INT);
DECLARE @T3 TABLE (K VARCHAR(1), V3 INT);
DECLARE @T4 TABLE (K VARCHAR(1), V4 INT);
INSERT INTO @T1 VALUES ('A', 1), ('C', 4);
INSERT INTO @T2 VALUES ('B', 2), ('D', 7);
INSERT INTO @T3 VALUES ('B', 3), ('C', 5);
INSERT INTO @T4 VALUES ('C', 6), ('D', 8);
SELECT COALESCE(t1.K, t2.K, t3.K, t4.K) [K], V1, V2, V3, V4
FROM @T1 t1
FULL JOIN @T2 t2 ON t2.K = t1.K
FULL JOIN @T3 t3 ON t3.K = t1.K OR t3.K = t2.K
FULL JOIN @T4 t4 ON t4.K = t1.K OR t4.K = t2.K OR t4.K = t3.K
ORDER BY 1;
Aber funktioniert dies auch nur für dieses einfache Beispiel, wenn ich mehr Ks (join-Bedingungen) und Vs, die join-Bedingungen am Ende wird eine Menge komplexer.
Wie kann diese Abfrage verbessert werden?
Kommentar zu dem Problem - Öffnen
+1 für den ASCII-Kunst!
Sind Sie auf der Suche nach etwas mehr überschaubar, oder willst du so etwas wie
FULL JOIN @T4 t4 t4.K (t1.K, t2.K, t3.K)
? @Okuma.Scott ASCII-art credits
@DigitalD Im-suchen nach Verbesserungen in der Wartbarkeit und performance
InformationsquelleAutor der Frage pomber | 2014-02-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es mehrere Möglichkeiten, aber ich denke, die folgende ist die beliebteste:
Wenn Sie eine separate Tabelle mit allen
k
Werte, die Sie verwenden können, anstelle derallk
Unterabfrage.Einen einfacheren Weg, um schreiben Sie Ihre
full outer join
Abfrage zu verwendencoalesce()
:Und die Dritte Methode ist die
union all
/group by
Methode:InformationsquelleAutor der Antwort Gordon Linoff