在标准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可以满足你的需求。