假設這是我的表 A:
Col1 Col2 Col3 Col4 Col5
a b c d e
a b c x f
b i j l m
b i j v t
我的第二張桌子B:
Col1 Col2 Col3 Col6
a b c g
a b c s
b i j u
b i j h
表 A 和 B 有共同的列(這里是 Col 1、Col 2 和 Col 3),表 B 只有唯一的行,沒有重復。我想要的是:
Col1 Col2 Col3 Col4 Col5 Col6
a b c d e g
a b c x f null
b i j l m u
b i j v t null
因此,要做的事情是僅在第一個匹配項上進行左連接,并且表 B 中匹配的所有其他行都應該為空/空。我試過這個查詢:
SELECT A.*, B.Col6,
FROM A
LEFT JOIN
B
ON
A.Col1 = B.Col1
AND A.Col2 = B.Col2
AND A.Col3 = B.Col3
但這給了我重復。我也嘗試了不同的 row_number() 但仍然不是預期的結果。我不能使用子查詢和 TOP 1 和 limit 1 也沒有給出預期的結果。我覺得這很簡單,但仍然沒有解決方案。
有人能幫我嗎?
uj5u.com熱心網友回復:
您可以進行橫向連接,如下所示:
select
x.col1, x.col2, x.col3, x.col4, x.col5,
case when x.rn = 1 then y.col6 end as col6
from (select *, row_number()
over(partition by col1, col2, col3 order by col4) as rn from a) x
left join lateral (
select * from b where (b.col1, b.col2, b.col3) = (x.col1, x.col2, x.col3)
order by col6 limit 1
) y on true
結果:
col1 col2 col3 col4 col5 col6
----- ----- ----- ----- ----- ----
a b c d e g
a b c x f null
b i j l m u
b i j v t null
請參閱DB Fiddle上的運行示例。
uj5u.com熱心網友回復:
也許OUTER APPLY可以幫助你:
SELECT A.*, B.Col6
FROM A
LEFT OUTER APPLY (SELECT TOP 1 *
FROM B WHERE A.Col1 = B.Col1
AND A.Col2 = B.Col2
AND A.Col3 = B.Col3) B
它會從左側向您回傳一個完全匹配的匹配項,如果沒有,您將擁有NULL您在示例中已經顯示的內容。
這將適用于 SQL Server。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/422063.html
標籤:
上一篇:計算給定表中有多少1
