2016-07-25 24 views
6

fusionieren Ich habe vier Tabellen:SQL SELECT zwei Spalten in einer

Tabelle A:

ID | B_ID 
---------- 
1 | 5 
2 | 6 
3 | 7 
4 | 8 

Tabelle B:

B_ID 
----- 
5 
6 
7 
8 

Tabelle C:

C_ID | C_Name 
-------------- 
5 | Alpha 
6 | Beta 

Tabelle D:

D_ID | D_Name 
-------------- 
7 | Delta 
8 | Gamma 

Hinweis, dass die Werte in der Tabelle B entweder aus Tabelle C Tabelle D oder kommen können

Ich muss nun eine Abfrage, die Name genannt ID aus Tabelle A und eine zweite Spalte zeigt, welche die entsprechenden besteht aus basierend Namen auf der B_ID Spalte der Tabelle B

das erwartete Ergebnis sollte wie folgt aussehen:

ID | Name 
---------- 
1 | Alpha 
2 | Beta 
3 | Delta 
4 | Gamma 

Was ich diese Abfrage ist versucht:

SELECT * 
FROM B 
LEFT OUTER JOIN C 
ON B_ID = C_ID 
LEFT OUTER JOIN D 
ON B_ID = D_ID 

Dies ergibt:

B_ID | C_ID | C_Name | D_ID | D_Name 
------------------------------------- 
5 | 5 | Alpha | Null | Null 
6 | 6 | Beta | Null | Null 
7 | Null | Null | Null | Delta 
8 | Null | Null | Null | Gamma 

Allerdings habe ich noch zwei Fragen:

  1. ich die Namen in einer einzigen Spalte fusionieren müssen (die erwartete Ergebnis siehe oben)
  2. Es muss eine Unterabfrage von SELECT basierend auf Tabelle A sein, um diezu zeigenSpalte der Tabelle A.
+0

bitte gewünschten Ausgang hinzufügen, damit wir es besser verstehen können –

+2

es ist bereits hinzugefügt. Bitte lesen Sie. siehe 'Das erwartete Ergebnis sollte wie folgt aussehen:' – beta

+0

Naja, mein Schlechter –

Antwort

4

Hier ist eine Möglichkeit, eine Unterabfrage mit union all mit:

select a.id, b.name 
from tablea a 
    join (select id, name from tablec 
     union all select id, name from tabled) b on a.B_ID = b.id 
+0

Ich bekomme in meinem Beispiel einen Hinweis, dass "(links) Outer Joins" verwendet werden soll. Haben Sie eine intuitive Lösung mit "(links) Outer Joins?" – beta

+1

@beta - Wenn Sie einen 'Outer Join' verwenden müssen, ersetzen Sie' Join' durch 'Left Join'. Es wird nur benötigt, wenn nicht alle entsprechenden Gebote würden existieren auf diesen Tabellen. – sgeddes

3

Sie * mit Ausdrücken ersetzen können, die das tun, was Sie

SELECT B.B_ID 
    , COAELESCE(C.C_NAME,D.D_NAME) AS `Name` 

wollen und das Hinzufügen eine Verbindung zu Tabelle A ist nicht schwer ...

SELECT A.A_ID      AS `Id` 
    , COAELESCE(C.C_NAME,D.D_NAME) AS `Name` 
    FROM A 
    LEFT 
    JOIN B 
    ON B.B_ID = A.B_ID 
    LEFT 
    JOIN C 
    ON C.C_ID = B.B_ID 
    LEFT 
    JOIN D 
    ON D.D_ID = B.B_ID 
ORDER 
    BY A.A_ID 

Wenn Sie eine andere Behandlung für NULL-Werte oder für die Behandlung möglicher doppelter ID-Werte benötigen, kann die Abfrage optimiert werden. (Das Beispiel Abfrage übernimmt eindeutige Werte für die x_ID Spalten.)

0

den Tabellen angegebenen Bedeutungen haben, schlage ich vor, die folgende Abfrage:

SELECT A.ID, C.C_NAME 
FROM @A A INNER JOIN @C C ON A.B_ID=C.C_ID 
UNION 
SELECT A.ID, D.D_NAME 
FROM @A A INNER JOIN @D D ON A.B_ID=D.D_ID 

Wenn Sie denken, es könnte doppelte Werte zurückgegeben und Sie wollen, dass sie, Verwenden Sie UNION ALL anstelle von UNION.