You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JOIN时排除含特定文档码的订单?SQL查询求助

问题描述

我的系统中一个订单可关联多个文档,每个文档对应一个文档码。数据示例如下:

订单文档文档码
11015E
11025E
11031DE
22015E

订单存储在表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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 13:54:53