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 = '%操作人员%'
问题是
这个执行的过程(不知道我说的对不对)是
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 位置,这个跟第二个比为什么不好使,原因
查询结果都是这个
请参照这个http://hi.baidu.com/bdivem/item/14ebf0bed57d6c4cbb0e1255,我以前遇到的类似问题看的是这个的
我这个怎么改
第一个问题我已经写的很清楚了,看了这个帖子,我的理解也没有错,为什么第二层条件过滤不好使
@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
@园源: 对,结果集是左边所有的数据,但是ri那个表不匹配的已经是过滤了的
@园源: 现在的问题是为什么第二层条件过滤不好使了呢
@q446223455: 第二层条件过滤指的是哪一行
@园源: 11行
@q446223455: 你把查询结果 3个字段都贴出来,数据尽量完整
@园源: 加我下qq把
@q446223455: 第一条数据的B列完全贴出来 ,'操作人员%' 前方一致,'%操作人员%'部分一致
@园源: 一共就这两条数据
@q446223455: B 列不是显示不全吗,你显示完整的看一下
@园源:
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 '操作人员'
@q446223455: 这个结果没问题啊,AI.ROLEINFO_ID = RI.ROLEINFO_ID,AI.DEL_SIGN = 1 的数据有2条啊,B表中的数据是筛选后的啊
第二个条件不好使, 注意你是使用了外链接, 多看下相关的执行计划. 就会明白, 在On的后面, 左右两表定义好了关联条件, 再加入其他条件, 基本就是 要么是对两表共同的约束, 要么是对左表的条件过滤, 要么是对右表的条件过滤.
1. 对两表共同的条件约束, 这个就不用考虑了. 基本写法.
2. 要么是对左表中添加了过滤条件,
3. 对右表的数据添加了过滤条件.
你的问题, 就是遇到了为这里面的第二点, 在 on 后面对左表的单独过滤. 这个结果, 是 在 [左右两表]先伍有联结后, 再进行条件过滤, 对于联接后生成新的 rows source, 才进行条件过滤, 对于左表不满足你指定条件的row, 使其中关于右表的键全部为空. 这里左表是主表.
我参考的是: http://blog.csdn.net/aqszhuaihuai/article/details/6238416