SQL 中NOT EXISTS的改写

   在标准SQL语句中 NOT EXISTS 对应于EXISTS,EXISTS筛选剩下的数据就是 NOT EXISTS对应数据,有了这层思路,我们就可以对相关的NOT EXISTS进行改写了。
<p>在进行SQL改写之前,我们先来看一对简单的例子,也许大部分人都会有这样的意识,EXISTS对应于INNER JOIN。</p>
SELECT T.* FROM TEST_EXISTS   T
WHERE  EXISTS(SELECT 1 FROM TEST01_EXISTS P WHERE T.CUST_CODE=P.CUST_CODE AND P.CUST_SHOURU >8000)
ORDER BY  T.CUST_CODE; 

select T.* FROM TEST_EXISTS T
        INNER JOIN TEST01_EXISTS P
      ON T.CUST_CODE=P.CUST_CODE 
      AND P.CUST_SHOURU >8000
      ORDER BY T.CUST_CODE; 

 两条SQL语句中出来的结果是一致的,显然是用INNER JOIN 去改写EXISTS是正确的,但是要是改写NOT EXISTS呢,还能用INNER JOIN吗,显然稍微想一想这是行不通的。

要想从EXISTS的反面筛选出数据,最起码你需要保持源表数据的完整性以后才能从源表中筛选出满足你条件的数据。

SELECT T.* FROM TEST_EXISTS   T
WHERE NOT  EXISTS(SELECT 1 FROM TEST01_EXISTS P WHERE T.CUST_CODE=P.CUST_CODE AND P.CUST_SHOURU >8000)
ORDER BY  T.CUST_CODE; 

SELECT T.*
  FROM TEST_EXISTS T
  LEFT JOIN TEST01_EXISTS P
    ON T.CUST_CODE = P.CUST_CODE
   AND P.CUST_SHOURU > 8000
 WHERE P.CUST_CODE IS NULL
 ORDER BY T.CUST_CODE;
要想保持数据的完整性,你只能用LEFT JOIN,然后从一个集合中去筛选满足你要求的数据,where可以满足你的需求。






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值