簡體   English   中英

模擬完全外部聯接:LEFT + RIGHT JOIN的UNION與交叉聯接的性能

[英]Simulating FULL OUTER JOIN: Performance of UNION of LEFT+RIGHT JOIN vs cross join

Access / Jet數據庫引擎不支持FULL OUTER JOIN

SELECT Table1.*, Table2.*
FROM Table1
FULL OUTER JOIN Table2 ON Table1.JoinField = Table2.JoinField

通常推薦的替代方法是UNION LEFTRIGH JOIN的結果。 在以下方面有一些變化:

SELECT Table1.*, Table2.*
FROM Table1
LEFT JOIN Table2 ON Table1.JoinField = Table2.JoinField

UNION ALL 
SELECT Table1.*, Table2.*
FROM Table1
RIGHT JOIN Table2 ON Table1.JoinField = Table2.JoinField
WHERE Table1.JoinField IS NULL

但是,是否也可以使用交叉聯接?

SELECT Table1.*, Table2.*
FROM Table1, Table2
WHERE Table1.JoinField = Table2.JoinField
    OR Table1.JoinField IS NULL
    OR Table2.JoinField IS NULL

以這種方式使用交叉聯接是否會對性能造成任何不利影響?

您的交叉FULL OUTER JOIN根本不是FULL OUTER JOIN 這是一個內部聯接,也將NULL匹配到所有記錄。

CROSS JOIN ,一個表中的行總是與另一表中的行匹配,而在FULL OUTER JOIN ,有任何行都不匹配。

為了說明,我創建了一個小樣本 (T-SQL,但這無關緊要)。 您可以看到返回了不相等的行。

但是,如果沒有Null值,則可以使用CROSS JOIN來模擬FULL OUTER JOIN ,方法是通過附加Null行,使用NOT EXISTS以及其他一些技巧來模擬。 但是,您會看到這是一個非常復雜的解決方案,通常首選普通的UNION

SELECT *
FROM (SELECT * FROM #Table1 UNION ALL SELECT Null, Null) t1, (SELECT * FROM #Table2 UNION ALL SELECT Null, Null) t2
WHERE (t1.JoinField = t2.JoinField
OR (NOT EXISTS(SELECT 1 FROM #Table2 WHERE #Table2.JoinField = t1.JoinField) AND t1.JoinField Is Not Null AND t2.JoinField IS NULL)
OR (NOT EXISTS(SELECT 1 FROM #Table1 WHERE #Table1.JoinField = t2.JoinField) AND t2.JoinField Is Not Null AND t1.JoinField IS NULL))
AND (t1.JoinField Is Not Null Or t2.JoinField Is Not Null) 

(在鏈接的示例中,您可以看到它的運行情況)

當我使用Redshift時,可能存在語法差異。

With a as
(
Select 1 id union all
Select 2 union all
Select 3 
)
, b as 
(
Select 2 d union all
Select 4 union all
Select 5 
)
Select a.*,b.* 
From a full join b on id=d

輸出是

id  d
1   NULL
2   2
3   NULL
NULL    4
NULL    5

如果你跑

Select a.*,b.* 
from a 
left join b on id=d 
union all
Select  a.*,b.* 
from b 
left join a on d=id

你得到

id  d
1   NULL
2   2
3   NULL
2   2
NULL    4
NULL    5

但是,如果僅合並,您將得到相同的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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