2006-10-24
left outer join的正确写法
Monday February 20, 2006 - 02:59pm (CST)
1)select customerid,b.aggregateno
from temptop10 a left outer join AGGREGATE_MEMBER b
on a.aggregateno=b.aggregateno and b.dwmonth='2005-12-31'
2)select customerid,b.aggregateno
from temptop10 a left outer join AGGREGATE_MEMBER b
on a.aggregateno=b.aggregateno where b.dwmonth='2005-12-31'
sql1和sql2看起来没什么分别,事实上差别大了。sql1是正确的写法,得到的是左连接的结果:
75736122-X | GL200405260015
F2685322-X | GL200405260015
| 75313212-0
| 15438327-8
| 74200965-3
| 48800033-7
11701-5009 | GL200506240001
15498586-9 | GL200506240001
.....
sql2的结果看起来确像一个等值连接的结果:
75736122-X | GL200405260015
F2685322-X | GL200405260015
11701-5009 | GL200506240001
15498586-9 | GL200506240001
15514263-1 | GL200506240001
15814304-4 | GL200506240001
15815336-5 | GL200506240001
61144602-8 | GL200511160014
75738868-4 | GL200511160014
26017968-4 | GL200312010002
61100604-9 | GL200312010002
61130906-6 | GL200312010002
....
分析原因,sql1是先解析on中的条件从b表过滤出数据然后left outer join a表,得出正确结果。sql2是先left outer join b 再按 where中的 dwmonth条件过滤,这时候左连接得到的笛卡儿乘积中的dwmonth为null的值就全部被过滤了,得到结果和等值连接一样。
结论:对被关联的表(如以上的b表)的限定条件,要写在on语句中Image
1)select customerid,b.aggregateno
from temptop10 a left outer join AGGREGATE_MEMBER b
on a.aggregateno=b.aggregateno and b.dwmonth='2005-12-31'
2)select customerid,b.aggregateno
from temptop10 a left outer join AGGREGATE_MEMBER b
on a.aggregateno=b.aggregateno where b.dwmonth='2005-12-31'
sql1和sql2看起来没什么分别,事实上差别大了。sql1是正确的写法,得到的是左连接的结果:
75736122-X | GL200405260015
F2685322-X | GL200405260015
| 75313212-0
| 15438327-8
| 74200965-3
| 48800033-7
11701-5009 | GL200506240001
15498586-9 | GL200506240001
.....
sql2的结果看起来确像一个等值连接的结果:
75736122-X | GL200405260015
F2685322-X | GL200405260015
11701-5009 | GL200506240001
15498586-9 | GL200506240001
15514263-1 | GL200506240001
15814304-4 | GL200506240001
15815336-5 | GL200506240001
61144602-8 | GL200511160014
75738868-4 | GL200511160014
26017968-4 | GL200312010002
61100604-9 | GL200312010002
61130906-6 | GL200312010002
....
分析原因,sql1是先解析on中的条件从b表过滤出数据然后left outer join a表,得出正确结果。sql2是先left outer join b 再按 where中的 dwmonth条件过滤,这时候左连接得到的笛卡儿乘积中的dwmonth为null的值就全部被过滤了,得到结果和等值连接一样。
结论:对被关联的表(如以上的b表)的限定条件,要写在on语句中Image
发表评论
- 浏览: 394593 次
- 性别:

- 来自: 上海

- 详细资料
搜索本博客
我的相册
Gmail
共 8 张
共 8 张
最新评论
-
JIRA不完全手册
楼主,发一份完整的资料给我吧 xwj1003@yahoo.com.cn
-- by volking -
java encoding参考
Good ,thanks.
-- by zuowei -
有多少异常可以重来
我今天也遇到这个问题,才搜到这个帖子~ 还没有解决,等恢复哦
-- by javamanlcy007 -
有多少异常可以重来
这个错误解决了,又抱了别的错误~
-- by iceworld4143 -
有多少异常可以重来
解释不太懂,我也遇到这个问题了,可是我没用ant。 :cry: 等回 ...
-- by iceworld4143






评论排行榜