in和not exists都是都可以。如下sql:
-- 注意in 后面的内容要用括号() 括起来
select * from b where (aaa,bbb) not in ( select aaa,bbb from a where 查询条件A);
select * from b where not exists ( select * from a where a.aaa=b.aaa and a.bbb=b.bbb and 查询条件A);
in返回的结果和条件顺序一致么
不一定,会按照返回结果字段进行排序。
所以使用的时候,一定不要看in的顺序,就认为结果也是这顺序,最好带标识字段。
in好还是 !=好
要看情况。 例如0是正常。 1,2,3,4,5都是错误
很显然 != 0 比较简单。 以后如果6也要过滤。 加个条件 and !=6 即可。
但是in的条件较少,如 in (1) ,那么!= 反而麻烦。
正确示例
推荐还是用关联的写法,比较好理解。
注:exists本身就是根据是否有没有来判断的,所以关联完毕后不要加t.num is not null之类的,这样写根本不对。
假设外部表是info,通过num关联。
只查有没有的写法:
<if test='params.isUse == "1" '>
where exists(
select 1
from t
where t.num=info.num
)
</if>
<if test='params.isUse == "0" '>
where not exists(
select 1
from t
where where t.num=info.num
)
</if>
带其他条件的写法:
<if test='params.isUse == "1" '>
where exists(
select 1
from t
where t.num=info.num
AND t.document_number= #{documentNumber}
)
</if>
<if test='params.isUse == "0" '>
where not exists(
select 1
from t
where t.num=info.num
AND t.document_number= #{documentNumber}
)
</if>
又一种错误的写法
本意是想一条sql支持各种入参,实际是错误的,发现没有,最终反馈给最外层的sql是
1=0或1=1或0=0或0=1,这些都是不对的,最终反馈给最外层的sql一定是带exists的。
haveFlag[0:不存在;1:存在]
<if test="haveFlag != null and haveFlag != ''">
AND (
CASE
WHEN EXISTS (
SELECT 1 FROM T_EXT te
WHERE tu.ID = te.P_ID
) THEN 1
ELSE 0
END
) = #{haveFlag}
</if>
为什么要用到exists
直接左关联不就能起到相同的作用吗?
确实是。
有一种情况,就是带明细行的情况,会比主表的数据多。
这时候分页会有偏差。
1、total是用的distinct。
2、那么实际数据的分页需要根据distinct的主表来分页,查询出的数据是明细行的条数。
汗,之前写的exists,居然忘了是这个作用。
实测如果结果集比较多,用exists虽然能查到结果,但是效率不高,所以推荐的做法是先查主表,分页拿到list数据后再查明细效率会提高很多。
那么,可以不用exists吗?
可以。查的时候就查主表,明细表单独查,这样就不会出现条数不一致的情况了。
26万+

被折叠的 条评论
为什么被折叠?



