簡體   English   中英

使用帶有多個 ON 的 join 子句組合來自多個表的值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM