如何在JOIN时排除含特定文档码的订单?SQL查询求助
问题描述
我的系统中一个订单可关联多个文档,每个文档对应一个文档码。数据示例如下:
| 订单 | 文档 | 文档码 |
|---|---|---|
| 1 | 101 | 5E |
| 1 | 102 | 5E |
| 1 | 103 | 1DE |
| 2 | 201 | 5E |
订单存储在表PDOCAS中,文档存储在表DOCCAB中。需求是:关联两表查询时,只要某订单包含文档码为1DE的文档,该订单就完全不被返回。
当前执行的SQL语句如下:
select p.DocCabIdDeb as 'Order', d.DocCabId as 'Document', d.DocCod as 'Code Doc' from PDOCAS p JOIN DOCCAB d on p.DocCabIdHab=d.DocCabId WHERE NOT EXISTS(select * from DOCCAB ds where ds.DocCabId=d.DocCabId and doccod='1DE') and p.DocCabIdDeb in (1, 2)
但这个查询仍返回了订单1的5E文档,我希望订单1完全不出现,请问该如何调整?
解决方案
你当前的NOT EXISTS条件只排除了本身是1DE的单条文档,但订单1关联的其他文档(101、102)不满足这个排除条件,所以会被保留。要实现“整个订单排除”,需要判断的是该订单关联的所有文档中是否存在1DE,而不是单条文档是否是1DE。
可以用两种方式调整:
方式一:通过订单级别的NOT EXISTS判断
select p.DocCabIdDeb as 'Order', d.DocCabId as 'Document', d.DocCod as 'Code Doc' from PDOCAS p JOIN DOCCAB d on p.DocCabIdHab = d.DocCabId WHERE NOT EXISTS ( select 1 from DOCCAB ds JOIN PDOCAS ps on ps.DocCabIdHab = ds.DocCabId where ps.DocCabIdDeb = p.DocCabIdDeb and ds.DocCod = '1DE' ) and p.DocCabIdDeb in (1, 2)
方式二:先筛选出要排除的订单再过滤
select p.DocCabIdDeb as 'Order', d.DocCabId as 'Document', d.DocCod as 'Code Doc' from PDOCAS p JOIN DOCCAB d on p.DocCabIdHab = d.DocCabId where p.DocCabIdDeb not in ( select ps.DocCabIdDeb from PDOCAS ps join DOCCAB ds on ps.DocCabIdHab = ds.DocCabId where ds.DocCod = '1DE' ) and p.DocCabIdDeb in (1, 2)
逻辑说明
- 方式一:子查询检查当前订单
p.DocCabIdDeb是否关联了任何DocCod='1DE'的文档,只要存在就排除整个订单的所有数据。 - 方式二:先找出所有包含
1DE文档的订单ID集合,再在主查询中直接排除这些订单ID。
两种写法都能实现“只要订单有一个1DE文档,就完全不返回该订单任何数据”的需求。
内容的提问来源于stack exchange,提问作者Cómputos
相关产品推荐
相关产品推荐

