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






### SQL Server `NOT EXISTS` 使用方法 在SQL Server中,`NOT EXISTS`是一个非常有用的谓词,用于检查子查询是否未返回任何行。当子查询不返回任何数据时,`NOT EXISTS`条件为真;反之则为假。 #### 基本语法结构 ```sql SELECT column_list FROM main_table AS mt WHERE NOT EXISTS ( SELECT 1 FROM related_table AS rt WHERE condition_between_tables); ``` 此模式通常应用于关联两个表格之间的关系验证场景,在这里`main_table`代表主要的数据源表而`related_table`则是辅助参照表[^2]。 #### 实际应用案例分析 考虑一个典型的业务需求——找出所有未曾下单的顾客信息: 假设数据库中有两张表:`Customers`存储着所有的顾客资料;另一张名为`Orders`保存了每笔销售订单详情。为了获取从未购买过的客户列表可以构建如下查询语句: ```sql SELECT * FROM Customers c WHERE NOT EXISTS ( SELECT * FROM Orders o WHERE o.customer_id = c.customer_id ); ``` 这段代码的作用在于遍历整个`Customers`集合,并针对每一个成员执行内部嵌套的选择操作来确认其是否有对应的订单记录存在于`Orders`之中。一旦发现某位客户的ID未能找到相匹配项,则意味着这位顾客至今为止还没有完成过任何形式的商品订购活动,因此会被最终的结果集所收录显示出来[^3]。 #### 性能优化建议 由于`NOT EXISTS`涉及到了两次扫描(外层全量读取加内层按需检索),所以在处理大规模数据集的时候可能会面临性能瓶颈问题。此时可以通过创建索引来加速特定字段上的查找效率或者改写成其他形式如LEFT JOIN...IS NULL的方式实现相同逻辑但更高效的运算效果[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值