SQL select объединить два столбца в один
у меня есть четыре таблицы:
Таблица A:
ID | B_ID
----------
1 | 5
2 | 6
3 | 7
4 | 8
Таблица B:
B_ID
-----
5
6
7
8
Таблица C:
C_ID | C_Name
--------------
5 | Alpha
6 | Beta
Таблица D:
D_ID | D_Name
--------------
7 | Delta
8 | Gamma
обратите внимание, что значения в таблице B могут исходить из таблицы C или таблицы D.
мне нужен запрос, который показывает ID
из таблицы A и второй столбец под названием Name
который состоит из соответствующих имен, основанных на B_ID
столбец таблицы B.
в ожидаемый результат должен выглядеть так:
ID | Name
----------
1 | Alpha
2 | Beta
3 | Delta
4 | Gamma
то, что я пробовал, это запрос:
SELECT *
FROM B
LEFT OUTER JOIN C
ON B_ID = C_ID
LEFT OUTER JOIN D
ON B_ID = D_ID
это дает:
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
тем не менее, у меня все еще есть два вопроса:
- мне нужно объединить их в один столбец (см. Ожидается результат выше)
- это должен быть подзапрос
SELECT
на основе Таблица A, чтобы показатьID
столбец таблицы A.
3 ответов
вот один из вариантов использования подзапроса с 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
вы можете заменить *
С выражениями, которые делают то, что вы хотите
SELECT B.B_ID
, COAELESCE(C.C_NAME,D.D_NAME) AS `Name`
и добавление соединения в таблицу A не сложно...
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
Если вам нужна другая обработка для значений NULL или для обработки потенциальных повторяющихся значений ID, запрос можно настроить. (Пример запроса предполагает уникальные значения для столбцов x_ID.)
учитывая таблицы, как определено, я предлагаю следующий запрос:
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
Если вы думаете, что могут быть возвращены повторяющиеся значения, и вы хотите их использовать UNION ALL
вместо UNION
.