[英]Combining values from multiple tables using join clause with multiple ON
我想使用 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
問題是您正在跨連接級聯條件。 例如,這里是表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
如果tablea
中沒有所有desc
,我們可以切換到full join
。 遵循的邏輯更復雜,但看起來像:
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.