![](/img/trans.png)
[英]SQL - merge two queries with different number of columns in select statement into one
[英]SQL select merge two columns into one
我有四张桌子:
表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的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`
在表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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.