我有四张桌子:
表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
列。答案 0 :(得分:4)
这是使用带有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
答案 1 :(得分:3)
您可以将 *
替换为您想要的表达式
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列的唯一值。)
答案 2 :(得分:0)
根据定义的表格,我建议以下查询:
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
。