各种数据库中的左外连接差异

时间:2014-02-06 01:38:38

标签: sql join

我帮助理解各种数据库解释左外连接的方式的差异。

在左右表之间存在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的计数,而Oracle似乎提出了更多。

感谢。

1 个答案:

答案 0 :(得分:1)

评论可能有点太长了。

首先,如果您要比较不同数据库中的查询,为什么要显示仅在其中一个数据库中运行的代码?使用casecoalesce(),可以非常轻松地跨数据库以标准方式编写此查询。

如果没有看到结果,我可以想到可能出现的两个差异。首先,您对不同数据库中的不同数据运行不同的查询。让我们忽略它,因为还有另一种可能性。

Oracle将NULL字符串值和空字符串值视为相同。这有各种各样的影响,特别是在使用NVL()(或进行聚合并获得一行而不是两行)时。我的猜测是Oracle的这种不标准的“特性”导致了不同的结果。

您可以使用大小写来区分查询,以便在所有数据库中获得相同的结果。将nvl(val1, val2)替换为:

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