使用join子句和多个ON组合来自多个表的值

问题描述

@H_502_0@我想使用LEFT JOIN子句合并所有相关数据,但是如果一个表中没有与其他表匹配的记录,它将不会显示。您能检查一下我的查询吗,似乎丢失或完全弄乱了。这是我的查询

SELECT*
FROM
MASTER_TBL 
LEFT JOIN
(
SELECT*
FROM
TBLA A
LEFT JOIN
TBLB B
ON
A.ID=B.ID AND A.DESC=B.DESC
LEFT JOIN
TBLC C
ON
B.ID=C.ID AND B.DESC=C.DESC
LEFT JOIN
TBLD D
ON
C.ID=D.ID AND C.DESC=D.DESC
) E
ON 
MASTER_TBL.ID=E.ID
@H_502_0@

enter image description here

解决方法

问题是您正在级联联接的条件。例如,这是表d的连接条件:

C.ID = D.ID AND C.DESC = D.DESC

要对此进行匹配,您需要在C中已有一个匹配行。

从查询的角度来看,您似乎可以使用主表中的id来搜索以下所有表。对于desc列,看来最好的选择是使用表a的表。

因此,请考虑:

select *
from master_tbl m
left join tbla a on a.id = m.id
left join tblb b on b.id = m.id and b.desc = a.desc
left join tblc c on c.id = m.id and c.desc = a.desc
left join tbld d on d.id = m.id and d.desc = a.desc

如果desc中所有tablea都不可用,我们可以切换到full join s。逻辑遵循起来更加复杂,但这看起来像:

select *
from master_tbl m
full join tbla a on a.id = m.id
full join tblb b on b.id = m.id and b.desc = a.desc
full join tblc c on c.id = m.id and c.desc = coalesce(a.desc,b.desc)
full join tbld d on d.id = m.id and d.desc = coalesce(a.desc,b.desc,c.desc)
,

此方法使用UNION ALL将名为表的字母(tbla,tblb,tblc,tbld)组合成一个CTE公用表表达式。然后,组合表将通过id,[desc]进行汇总,并跨登录列进行交叉表化(或透视)。然后,将透视结果LEFT JOIN添加到master_tbl。像这样的东西。

with
tbl_cte(tbl,id,[login],[desc]) as (
    select 'A',* from tbla
    union all
    select 'B',* from tblb
    union all
    select 'C',* from tblc
    union all
    select 'D',* from tblc),pvt_cte(id,tbla_login,tblb_login,tblc_login,tbld_login,[desc]) as (
    select id,max(case when tbl='A' then [login] else null end) as tbla_login,max(case when tbl='B' then [login] else null end) as tblb_login,max(case when tbl='C' then [login] else null end) as tblc_login,max(case when tbl='D' then [login] else null end) as tbld_login,[desc] 
    from tbl_cte
    group by id,[desc])
select mt.id,[name],country,[status],pc.tbla_login,pc.tblb_login,pc.tblc_login,pc.tbld_login,pc.[desc]
from master_tbl mt
     left join pvt_cte pc on mt.id=pc.id;