2014-02-06 27 views
0

我幫助理解各種數據庫解釋左外連接方式的差異。各種數據庫中的左外連接差異

在左右表之間存在1:1關係的場景中,我想象連接操作的計數將完全等於左表中的計數。

我已經注意到這對於MS SQL來說是正確的,但是Oracle(PL/SQL)似乎對此有不同的解釋。 Oracle中左外連接的計數是左表中所有條目的總和+右邊的匹配條目。

請確認我的理解是否正確,如果我們需要在Oracle和MS SQL之間協調數據,那麼最佳方法是什麼。

的代碼 -

select distinct NVL(L11, NVL(L10, NVL(L9, NVL(L8, NVL(L7, NVL(L6, NVL(L5, NVL(L4, NVL(L3, NVL(L2, NVL(L1,  NVL(L0,'ERR')))))))))))) ENDITEM, case when l1 = 'Raw Wafer' then l0 
when l2 = 'ABC' then l1 
when l3 = 'ABC' then l2 
when l4 = 'ABC' then l3 
when l5 = 'ABC' then l4 
when l6 = 'ABC' then l5 
when l7 = 'ABC' then l6 
when l8 = 'ABC' then l7 
when l9 = 'ABC' then l8 
when l10 = 'ABC' then l9 
when l11 = 'ABC' then l10 end item, g1.item bl1, g2.item bl2, g3.item bl3, g4.item bl4, g5.item bl5, g6.item  bl6, g7.item bl7, g8.item bl8, g9.item bl9, g10.item bl10, g11.item bl11, 
decode(g1.item, null, 0, 1) + decode(g2.item, null, 0, 1) + decode(g3.item, null, 0, 1) + decode(g4.item,  null, 0, 1) + decode(g5.item, null, 0, 1) + decode(g6.item, null, 0, 1) + decode(g7.item, null, 0, 1) + decode(g8.item, null, 0, 1) + decode(g9.item, null, 0, 1) + decode(g10.item, null, 0, 1) + decode(g11.item, null, 0, 1) cnt, 
gg.* from TABL1 gg 
left outer join TABL2 g1 on g1.item = gg.l1 
left outer join TABL2 g2 on g2.item = gg.l2 
left outer join TABL2 g3 on g3.item = gg.l3   
left outer join TABL2 g4 on g4.item = gg.l4   
left outer join TABL2 g5 on g5.item = gg.l5   
left outer join TABL2 g6 on g6.item = gg.l6 
left outer join TABL2 g7 on g7.item = gg.l7 
left outer join TABL2 g8 on g8.item = gg.l8 
left outer join TABL2 g9 on g9.item = gg.l9 
left outer join TABL2 g10 on g10.item = gg.l10 
left outer join TABL2 g11 on g11.item = gg.l11 

當我做這個MS SQL計數從TABL1建議只計數而甲骨文似乎更建議。

謝謝。

+1

Oracle的行爲應該是相同的 - 我懷疑你的連接條件或語法是不正確的。 –

+1

左外連接以所有數據庫的標準方式定義。請發佈Oracle代碼;它沒有做你認爲正在做的事情。 –

+0

同意以上評論這是一個編碼問題。 – Namphibian

回答

1

這可能是太長的評論。

首先,如果您要比較不同數據庫中的查詢,爲什麼只顯示其中一個數據庫的代碼?使用casecoalesce()可以非常容易地在數據庫中以標準方式編寫此查詢。

沒有看到結果,我可以想到可能出現的兩種差異。首先,您正在對不同數據庫中的不同數據運行不同的查詢。讓我們忽略這一點,因爲還有另一種可能性。

Oracle將NULL字符串值和空字符串值視爲相同。這具有各種各樣的影響,特別是在使用NVL()(或進行聚合並獲得一行而不是兩行)時。我的猜測是,這種Oracle的不標準「特性」導致了不同的結果。

通過使用大小寫,您可以以不同的方式對查詢進行短語處理,以在所有數據庫中獲得相同的結果。將nvl(val1, val2)替換爲:

(case when val1 is null or val1 = '' then val2 else val1 end) 
+0

謝謝。將恢復。 – user3277704