SQL select 将两列合并为一列
SQL select merge two columns into one
我有四张表:
Table答:
ID | B_ID
----------
1 | 5
2 | 6
3 | 7
4 | 8
Table乙:
B_ID
-----
5
6
7
8
Table C:
C_ID | C_Name
--------------
5 | Alpha
6 | Beta
Table D:
D_ID | D_Name
--------------
7 | Delta
8 | Gamma
请注意,Table B 中的值可以来自 Table C 或 Table D。
我现在需要一个查询,它显示 Table A 中的 ID
和名为 Name
的第二列,其中包含基于 B_ID
列的相应名称Table 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
的子查询基于
Table A 为了显示 Table A. 的 ID
列
这是使用带有 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`
向 table 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
。
我有四张表:
Table答:
ID | B_ID
----------
1 | 5
2 | 6
3 | 7
4 | 8
Table乙:
B_ID
-----
5
6
7
8
Table C:
C_ID | C_Name
--------------
5 | Alpha
6 | Beta
Table D:
D_ID | D_Name
--------------
7 | Delta
8 | Gamma
请注意,Table B 中的值可以来自 Table C 或 Table D。
我现在需要一个查询,它显示 Table A 中的 ID
和名为 Name
的第二列,其中包含基于 B_ID
列的相应名称Table 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
的子查询基于 Table A 为了显示 Table A. 的
ID
列
这是使用带有 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`
向 table 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
。