标题不好,但这是我发现将我的问题与简单的表格区分开来的方式,因为我以前的研究总是让我接触到这些主题。
我有几张桌子 - 为简化起见,我们只用3:A,B,C命名它们。我想把它们全部放在一张桌子上,作为主表。
但是,表B中的标题也与表C中的键相关。这就是我的表格:
Table A
KEY.1 KEY.2 A.HEADER
A NULL X
B NULL X
NULL AA X
NULL BB X
C NULL X
A NULL X
NULL AA X
Table B
KEY.1 B.HEADER
A 1
B 2
C 3
D 4
E 5
F 6
Table C
KEY.2 KEY.1
AA D
BB E
CC F
我想:
Final Table
KEY.1 KEY.2 B.HEADER A.HEADER
A NULL 1 X
B NULL 2 X
D AA 4 X
E BB 5 X
C NULL 3 X
有人可以帮助我吗?
答案 0 :(得分:1)
我终于能够通过此处提供的帮助找到问题的解决方案。查询应为:
SELECT DISTINCT
coalesce(A.KEY1, C.KEY1) as KEY1,
A.KEY2,
B.HEADER,
A.HEADER
FROM A
LEFT JOIN C ON (A.KEY2 = C.KEY2)
LEFT JOIN B ON (coalesce(A.KEY1, C.KEY1) = B.KEY1)
答案 1 :(得分:0)
这对你有用 - 你只需要为表B的第二次连接提供一个不同的别名(因为它是一个不同的结果集):
SELECT a.headers, b.headers, BSpecial.specialheader, c.headers, d.headers
FROM TableA A
LEFT OUTER JOIN TableB AS B on (a.key = b.key)
LEFT OUTER JOIN TableC AS C on (a.key = c.key)
LEFT OUTER JOIN TableD AS D on (a.key = d.key)
LEFT OUTER JOIN TableB AS BSpecial on (BSpecial.key = d.key)
答案 2 :(得分:0)
从您的示例来看,当表A中没有键时,您想要加入表C中的值 - 如果是这样的话那么您应该可以加入"无论哪一个可用"使用the coalesce
function。我无法测试,但这应该让你接近:
Select , b.header, c.header, a.header
from TableA a
LEFT JOIN TableC as c on (a.key = c.key)
LEFT JOIN TableB as b on (COALESCE(a.key,c.b.key) = b.key)
(订单与coalesce
有关 - 它会使用它找到的第一个非空值,因此您可能希望翻转订单,如果这更好 - 我不知道您的表是否有定义两个值的情况,或者您期望的行为是什么......)