2016-05-04 10 views
2

Ich möchte bedingte Join von drei Tabellen machen. Linke Tabelle B verbinden und wenn der Schlüssel fehlt beitreten dann C. TabelleSQL bedingte Verknüpfung zu mehreren Tabellen in einem Schuss

+------+--+------+-------------+--+------+-------------+ 
| A.id | | B.id | B.OtherFish | | C.id | C.OtherFish | 
+------+--+------+-------------+--+------+-------------+ 
| 1 | | 1 | B1   | | 1 | C1   | 
| 2 | |  |    | | 2 | C2   | 
| 3 | | 3 | B3   | | 3 | C3   | 
| 4 | |  |    | | 4 | C4   | 
| 5 | | 5 | B5   | |  |    | 
| 6 | | 6 | B6   | | 6 | C6   | 
+------+--+------+-------------+--+------+-------------+ 

Es gibt keine passenden Schlüssel für 2 und 4 in B und keine Tasten 5 in C Erwartete Ergebnisse:

+------+-----------+ 
| A.id | OtherFish | 
+------+-----------+ 
| 1 | B1  | 
| 2 | C2  | 
| 3 | B3  | 
| 4 | C4  | 
| 5 | B5  | 
| 6 | B6  | 
+------+-----------+ 

die Abfrage ich benutze, ist:

select 
A.id 
,coalesce(B.id,C.id) 
,coalesce(B.OtherFish,C.OtherFish) 
from A 
left join B 
on A.id=B.id 
left join C 
on A.id=C.id 

der Nachteil dieses Ansatzes ist, dass ich für alle Spalten verwenden verschmelzen ich aus verschiedenen Tabellen benötigen. Es ist ärgerlich, wenn es hundert Spalten in der Tabelle gibt. Es wäre wünschenswert, eine Koaleszenz für die gesamten Aliase wie coalesce(B,C) zu machen.

Ist es möglich, es wie in einem Schuss zu machen:

left join B 
on A.id=B.id 
left join C 
on A.id=(case when B.id is null then C.id end) 

so dass in C.id würde ich alle guten Daten haben, ohne alle Spalten zu machen verschmelzen durch?

+0

einige Beispieltabellendaten hinzufügen und das erwartete Ergebnis. – jarlh

+0

Welche RDBMS verwenden Sie? –

+1

Was ist los mit COALESCE? –

Antwort

2

Obwohl ich nichts falsch mit COALESCE sehen, können Sie versuchen UNION verwenden, etwa so:

SELECT a.id,t.OtherFish 
FROM A 
LEFT JOIN(SELECT b.id,b.otherFish FROM b 
      UNION ALL 
      SELECT c.id,c.otherFish FROM C 
      where c.id NOT EXISTS(SELECT 1 FROM b bb WHERE bb.id = c.id)) t 
ON(a.id = t.id) 
+0

@GordonLinoff Mmm, ich verstehe nicht warum. – sagi

+0

Danke für diesen Ansatz. Dennoch ist es enttäuschend, dass keine einfachere Lösung vorgestellt wurde. Im Vergleich zu Mathe möchte ich den Alias ​​außerhalb der Klammern platzieren, um zu vermeiden, dass Hunderte von Spalten zusammengefügt werden. –

+0

Sorry, ich bezweifle, dass es eine andere Lösung gibt. Im Allgemeinen ist Koaleszieren der richtige Weg, um dies zu lösen, obwohl diese Abfrage möglicherweise etwas schneller ist. Ich habe noch nie von einer anderen Lösung gehört. Das ist keine Mathematik. @PrzemyslawRemin – sagi