sql中exists进行多列的判断


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吗?
可以。查的时候就查主表,明细表单独查,这样就不会出现条数不一致的情况了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值