我帮助理解各种数据库解释左外连接的方式的差异。
在左右表之间存在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似乎提出了更多。
感谢。
答案 0 :(得分:1)
评论可能有点太长了。
首先,如果您要比较不同数据库中的查询,为什么要显示仅在其中一个数据库中运行的代码?使用case
和coalesce()
,可以非常轻松地跨数据库以标准方式编写此查询。
如果没有看到结果,我可以想到可能出现的两个差异。首先,您对不同数据库中的不同数据运行不同的查询。让我们忽略它,因为还有另一种可能性。
Oracle将NULL字符串值和空字符串值视为相同。这有各种各样的影响,特别是在使用NVL()
(或进行聚合并获得一行而不是两行)时。我的猜测是Oracle的这种不标准的“特性”导致了不同的结果。
您可以使用大小写来区分查询,以便在所有数据库中获得相同的结果。将nvl(val1, val2)
替换为:
(case when val1 is null or val1 = '' then val2 else val1 end)