首页 新闻 赞助 找找看

oracle left join on 条件1 and(where) 条件2

0
悬赏园豆:50 [已解决问题] 解决于 2014-06-19 10:23
 1 SELECT dd.* 
2
FROM ( 3 SELECT AI.ADMININFO_ID as a, 4 RI.ROLEINFO_NAME as b, 5 AI.DEL_SIGN 6 FROM ADMININFO AI 7 LEFT JOIN ROLEINFO RI 8 on AI.ROLEINFO_ID = RI.ROLEINFO_ID 9 AND AI.DEL_SIGN = 1 10 AND RI.ROLEINFO_NAME LIKE '%操作人员%' 11 ) DD WHERE dd.b = '%操作人员%'

问题是

 再套一层在第一层的结果集上过滤,第二层的过滤为啥不好使呢 

这个执行的过程(不知道我说的对不对)是

 有and条件的话就是先过滤两个表的条件,然后再连接 ,这样产生的结果集会小很多,
 再套一层就是在结果集上过滤了,但是现在过滤不好使、 
 
2.
1 SELECT       AI.ADMININFO_ID as a,
2                RI.ROLEINFO_NAME as b,
3                AI.DEL_SIGN
4           FROM ADMININFO AI
5           LEFT JOIN ROLEINFO RI
6             on AI.ROLEINFO_ID = RI.ROLEINFO_ID
7            where AI.DEL_SIGN = 1
8            AND RI.ROLEINFO_NAME LIKE '%操作人员%'

我知道这个好使,如果你想告诉我这样好使的话就不用回帖了,我要知道的是第一个为什么不好使,为什么

 

3

1 SELECT       AI.ADMININFO_ID as a,
2                RI.ROLEINFO_NAME as b,
3                AI.DEL_SIGN
4           FROM ADMININFO AI
5           LEFT JOIN ROLEINFO RI
6             on AI.ROLEINFO_ID = RI.ROLEINFO_ID
7            AND AI.DEL_SIGN = 1
8            WHERE RI.ROLEINFO_NAME LIKE '操作人员%'

注意where 位置,这个跟第二个比为什么不好使,原因

问题补充:

查询结果都是这个

GrandKai的主页 GrandKai | 初学一级 | 园豆:119
提问于:2014-05-23 13:32
< >
分享
最佳答案
0

请参照这个http://hi.baidu.com/bdivem/item/14ebf0bed57d6c4cbb0e1255,我以前遇到的类似问题看的是这个的

收获园豆:50
园源 | 初学一级 |园豆:155 | 2014-05-23 14:01

我这个怎么改

GrandKai | 园豆:119 (初学一级) | 2014-05-23 15:06

第一个问题我已经写的很清楚了,看了这个帖子,我的理解也没有错,为什么第二层条件过滤不好使

GrandKai | 园豆:119 (初学一级) | 2014-05-23 15:07

@q446223455: 

“有and条件的话就是先过滤两个表的条件,然后再连接 ,这样产生的结果集会小很多” 这句话有问题

1 SELECT dd.*  2 FROM (  3 SELECT AI.ADMININFO_ID as a,  4 RI.ROLEINFO_NAME as b,  5 AI.DEL_SIGN  6 FROM ADMININFO AI  7 LEFT JOIN ROLEINFO RI  8 on AI.ROLEINFO_ID = RI.ROLEINFO_ID  9 AND AI.DEL_SIGN = 1 10 AND RI.ROLEINFO_NAME LIKE '%操作人员%' 11 ) DD WHERE dd.b = '%操作人员%'

第10行的过滤条件是完全没有用的, AI left join RI, RI.ROLEINFO_NAME 作为的是对RI的连接条件的过滤,并不会使结果集少,这个的关键是left join

园源 | 园豆:155 (初学一级) | 2014-05-23 15:57

@园源: 对,结果集是左边所有的数据,但是ri那个表不匹配的已经是过滤了的

GrandKai | 园豆:119 (初学一级) | 2014-05-23 16:05

@园源: 现在的问题是为什么第二层条件过滤不好使了呢

GrandKai | 园豆:119 (初学一级) | 2014-05-23 16:06

@q446223455: 第二层条件过滤指的是哪一行

园源 | 园豆:155 (初学一级) | 2014-05-23 16:12

@园源: 11行

GrandKai | 园豆:119 (初学一级) | 2014-05-23 16:13

@q446223455: 你把查询结果 3个字段都贴出来,数据尽量完整

园源 | 园豆:155 (初学一级) | 2014-05-23 16:20

@园源: 加我下qq把

GrandKai | 园豆:119 (初学一级) | 2014-05-23 16:22

@q446223455: 第一条数据的B列完全贴出来 ,'操作人员%' 前方一致,'%操作人员%'部分一致

园源 | 园豆:155 (初学一级) | 2014-05-23 16:41

@园源: 一共就这两条数据

GrandKai | 园豆:119 (初学一级) | 2014-05-23 16:42

@q446223455: B 列不是显示不全吗,你显示完整的看一下

园源 | 园豆:155 (初学一级) | 2014-05-23 16:48

@园源: 

SELECT
AI.ADMININFO_ID AS a,
RI.ROLEINFO_NAME as b,
AI.DEL_SIGN
FROM ADMININFO AI
LEFT JOIN ROLEINFO RI
ON AI.ROLEINFO_ID = RI.ROLEINFO_ID


and AI.DEL_SIGN = 1 AND
RI.ROLEINFO_NAME like '操作人员'

 

GrandKai | 园豆:119 (初学一级) | 2014-05-23 16:51

@q446223455: 这个结果没问题啊,AI.ROLEINFO_ID = RI.ROLEINFO_ID,AI.DEL_SIGN = 1 的数据有2条啊,B表中的数据是筛选后的啊

园源 | 园豆:155 (初学一级) | 2014-05-23 17:00
其他回答(1)
0

第二个条件不好使, 注意你是使用了外链接, 多看下相关的执行计划. 就会明白, 在On的后面, 左右两表定义好了关联条件, 再加入其他条件, 基本就是 要么是对两表共同的约束,  要么是对左表的条件过滤, 要么是对右表的条件过滤. 

1. 对两表共同的条件约束, 这个就不用考虑了. 基本写法. 

2. 要么是对左表中添加了过滤条件, 

3. 对右表的数据添加了过滤条件.

你的问题, 就是遇到了为这里面的第二点, 在 on 后面对左表的单独过滤. 这个结果, 是 在 [左右两表]先伍有联结后, 再进行条件过滤, 对于联接后生成新的 rows  source, 才进行条件过滤,  对于左表不满足你指定条件的row, 使其中关于右表的键全部为空.  这里左表是主表. 

我参考的是: http://blog.csdn.net/aqszhuaihuai/article/details/6238416

fengxia | 园豆:202 (菜鸟二级) | 2017-02-23 15:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册