SQL select 将两列合二为一
Posted
技术标签:
【中文标题】SQL select 将两列合二为一【英文标题】:SQL select merge two columns into one 【发布时间】:2016-11-28 22:58:06 【问题描述】:我有四张桌子:
表 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。
我现在需要一个查询,它显示表 A 中的 ID
和名为 Name
的第二列,其中包含基于表 B 的 B_ID
列的相应名称。
预期结果应如下所示:
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 以显示表 A 的ID
列。
【问题讨论】:
请添加所需的输出,以便我们更好地理解它 已添加。请阅读。见The expected result should look like:
要修改您自己的查询,您应该查看COALESCE(C_Name, D_Name) AS Name
,但正如@sgeddes 所指出的,还有一种更直接的方法。
【参考方案1】:
这是使用带有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
【讨论】:
我在我的例子中得到了一个提示,应该使用“(左)外连接”。你有“(左)外连接)的直观解决方案吗? @beta -- 如果您需要使用outer join
,请将join
替换为left join
。仅当这些表格上没有所有相应的出价时才需要它。【参考方案2】:
您可以将 *
替换为您想要的表达式
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 列的值是唯一的。)
【讨论】:
【参考方案3】:鉴于定义的表,我建议进行以下查询:
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
。
【讨论】:
以上是关于SQL select 将两列合二为一的主要内容,如果未能解决你的问题,请参考以下文章