oracle多个字段外连接,加入Oracle表中的(多个外连接)

我相信,查询应该是这个样子:

SELECT r.aa, n.bb, nd.cc, u.id, ud.dd, g.attr

FROM tab1 AS u

INNER JOIN tab2 AS v ON u.user1 = v.user1 AND u.id = 102

LEFT OUTER JOIN tab3 AS a ON a.user = u.user

LEFT OUTER JOIN tab4 AS n ON n.nas = a.nas

LEFT OUTER JOIN tab5 AS d ON n.nas1 = d.nas1

LEFT OUTER JOIN tab6 AS r ON r.xx = n.xx

LEFT OUTER JOIN (SELECT g.attr, g.ac

FROM tab7 AS x

JOIN tab8 AS atr ON x.sso = atr.sso

WHERE UPPER(atr.name) = 'NAME'

) AS g ON a.ac = g.ac

我改变了别名“第二”只是“d”和“UD”到'v',以便所有别名都是单个字母。 Informix表示法中的嵌套OUTER(tab7 g, tab8 atr)本身就是一个内部联接(与我版本中的子选择一样),但该结果集与外部联接的a.ac。这就是重写所说的。

我在子查询中使用了WHERE子句;如果你愿意,WHERE条件可以留在ON子句中。优化器可能正确和等价处理的机会。同样,内部联接中的AND u.id = 102可以放置在WHERE子句中。同样,优化器可能会推低过滤条件以获得更好的性能。

请注意,子查询中的UPPER功能可能需要进行表扫描 - 除非在UPPER(atr.name)上有功能索引。

重温这个,查询的初始部分的音译不准确。

原始查询包括FROM子句:

FROM tab1 u, tab2 ud, OUTER(tab3 a, tab4 n, tab5 nd, tab6 r, OUTER(tab7 g, tab8 atr))

的表格tab3,tab4,tab5和tab6是内彼此接合,其结果是外连结到tab1和tab2。同样,tab8内部连接到tab7,但其结果是外部连接到表3-6的内部连接。我给原来的答案(基于问题的提纲答案)将在旧的Informix符号使用表示:

FROM tab1 u, tab2 ud,

OUTER(tab3 a, OUTER(tab4 n, OUTER(tab5 nd, OUTER(tab6 r, OUTER(tab7 g, tab8 atr)))))

因此,它会更准确抄写原始查询为:

SELECT r.aa, n.bb, nd.cc, u.id, ud.dd, g.attr

FROM tab1 AS u

JOIN tab2 AS v ON u.user1 = v.user1 AND u.id = 102

LEFT OUTER JOIN

(SELECT *

FROM tab3 AS a ON a.user = u.user

JOIN tab4 AS n ON n.nas = a.nas

JOIN tab5 AS d ON n.nas1 = d.nas1

JOIN tab6 AS r ON r.xx = n.xx

LEFT OUTER JOIN

(SELECT g.attr, g.ac

FROM tab7 AS x

JOIN tab8 AS atr ON x.sso = atr.sso

WHERE UPPER(atr.name) = 'NAME'

) AS g ON a.ac = g.ac

) AS loj

剩余的问题是确保正确的别名正在用于复杂的子查询中的列。请注意,在没有LEFT,RIGHT或FULL的情况下,JOIN被假定为INNER加入;另外,如果指定了LEFT,RIGHT或FULL,OUTER是可选的。

需要注意的另一个细节:过滤条件下旧式Informix OUTER联接的行为与标准SQL OUTER联接的行为不同。这很少有所作为,但偶尔也可能很重要。总体而言,标准SQL OUTER联接的行为通常更符合您的想法,但如果您运行回归测试并发现答案中存在差异,则可能是因为旧式Informix OUTER联接会以不同的方式做不同的事情来自新式Standard SQL OUTER连接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值