关于oracle选择left join执行顺序的疑问

[复制链接]
查看11 | 回复9 | 2009-1-4 14:52:28 | 显示全部楼层 |阅读模式
我这里有条SQL, left join 5张表,比如 a left join b left join c left join d left join e
我的本意是a,b join后和C join然后再和 d ,得到的数据再和e join
但是ORACLE会根据表的大小来自动选择join的驱动表,导致数据丢失。
难道大家在写多个left join会加括号吗?
回复

使用道具 举报

千问 | 2009-1-4 14:52:28 | 显示全部楼层
可以拆分成多个少表的关联后在最对后的关联.
回复

使用道具 举报

千问 | 2009-1-4 14:52:28 | 显示全部楼层
你看看执行计划就知道了。你只管提出WHAT,就是SQL,要取得什么数据。至于HOW,就是ORACLE的事了。如果处于性能方面的考虑,看看执行计划。
回复

使用道具 举报

千问 | 2009-1-4 14:52:28 | 显示全部楼层
我是说多个left join如果不限制执行顺序,会导致数据丢失.
回复

使用道具 举报

千问 | 2009-1-4 14:52:28 | 显示全部楼层
我记得使用(+) 会丢失数据。 使用 left outer join 就不会的
回复

使用道具 举报

千问 | 2009-1-4 14:52:28 | 显示全部楼层
原帖由 oradbHome 于 2009-3-7 19:40 发表
我记得使用(+) 会丢失数据。 使用 left outer join 就不会的

你们这里说的丢失是数据查询不出来吗??
回复

使用道具 举报

千问 | 2009-1-4 14:52:28 | 显示全部楼层
原帖由 tom_fans 于 2009-3-7 18:38 发表
我是说多个left join如果不限制执行顺序,会导致数据丢失.

如果真这样,ORACLE软件早该扔到垃圾桶里。
回复

使用道具 举报

千问 | 2009-1-4 14:52:28 | 显示全部楼层
应该不会有问题
回复

使用道具 举报

千问 | 2009-1-4 14:52:28 | 显示全部楼层
原帖由 xsmdel 于 2009-3-7 20:03 发表

你们这里说的丢失是数据查询不出来吗??

其实也不是差不出数据来. left outer join b 后在有b 的限制条件.
eg:
select * from t1, t2 where t1.col1=t2.col1(+) and t2.col2=val 但不满足t2.col2=val 时t1的数据显示不全.(做个子查询就可以)
如果用子查询就是
select * from t1, (select * from t2 where t2.col2=val) t where t1.col1=t.col1 , 就是lz所说的用括号.
如果用left outer join :

select * from t1 left outer join t2 on t1.col1=t2.col1 and t2.col2=val.
我想lz说的是这个意思.
回复

使用道具 举报

千问 | 2009-1-4 14:52:28 | 显示全部楼层
LS的才真明白我的意思. 怎么其他人感觉没用过left join一样.
left join很明显如果顺序出问题了,数据肯定查的不全啊. 如果是inner join那就随便什么顺序了.
如果我 a left join b left join c, 一般我们认为是 a 先和b left join再和c left join, 如果ORACLE通过CBO来走计划可能会变成a 和C,然后和B.
所以我问你们是否用括号,我现在自己是用括号来解决.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行