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 将两列合二为一的主要内容,如果未能解决你的问题,请参考以下文章

Postgres - 将两列聚合为一项

Java GridLayout 如何将两列合并为一列?

如何像蜂巢中的地图一样将两列合并为一列?

将两列的值相加并显示在下一行

如何在sql中将两列连接成一个新列?

如何在 Sqlite 中将两列合二为一,同时获取外键的底层值?