2016-07-25 68 views
6

że cztery tabele:SQL wybrać połączenie dwóch kolumn w jednym

Tabela A:

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

Tabela B:

B_ID 
----- 
5 
6 
7 
8 

Tabela C:

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

Tabela D:

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

uwaga, że ​​wartości podane w tabeli B może pochodzić albo z Tabeli C lub w tabeli D.

muszę się zapytanie, która pokazuje ID z tabeli A i drugą kolumnę o nazwie Name który składa się z odpowiadającym nazwy oparte na kolumnie tabeli B.

oczekiwanego rezultatu B_ID powinna wyglądać następująco:

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

Co próbowałem jest to zapytanie:

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

Daje:

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 

Jednak mam jeszcze dwie kwestie:

  1. muszę połączyć nazwiska w jednej kolumnie (patrz oczekiwany wynik powyżej)
  2. Musi to być podzapytanie z SELECT opartej na Tabeli A w celu wyświetlenia ID kolumna tabeli A.
+0

proszę dodać pożądany wynik, abyśmy mogli go lepiej zrozumieć –

+2

jest już dodany. proszę przeczytaj. zobacz 'Oczekiwany wynik powinien wyglądać tak:' – beta

+0

no cóż, mój zły –

Odpowiedz

4

Oto jedna opcja za pomocą podzapytania z union all:

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

Dostaję podpowiedź w moim przykładzie, że "(lewe) zewnętrzne sprzężenia" powinny być użyte. czy masz intuicyjne rozwiązanie z "(lewymi) zewnętrznymi złączeniami)? – beta

+1

@beta - jeśli musisz użyć' zewnętrznego sprzężenia', zamień 'join' z' lewym złączem'. Jest to potrzebne tylko wtedy, gdy nie wszystkie odpowiednie oferty istnieją na tych stołach. – sgeddes

3

Można zastąpić * z wyrażeniami, że to, co chcesz

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

i dodawanie dołączenie do tabeli A nie jest trudne ...

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 

Jeśli potrzebujesz innej obsługi dla wartości NULL lub dla obsługi potencjalnych duplikatów wartości, zapytanie może zostać zmodyfikowane. (Przykład kwerendy zakłada unikatowe wartości dla kolumn x_ID.)

0

Biorąc tabele zdefiniowane, proponuję następujące zapytanie:

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 

Jeśli uważasz, że nie może być zduplikowane wartości zwracane i chcesz je, użyj UNION ALL zamiast UNION.