SQL - 跨越'交叉'表

时间:2017-07-03 19:06:17

标签: mysql sql sql-server

标题不好,但这是我发现将我的问题与简单的表格区分开来的方式,因为我以前的研究总是让我接触到这些主题。

我有几张桌子 - 为简化起见,我们只用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

有人可以帮助我吗?

3 个答案:

答案 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有关 - 它会使用它找到的第一个非空值,因此您可能希望翻转订单,如果这更好 - 我不知道您的表是否有定义两个值的情况,或者您期望的行为是什么......)