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

如何编写SQL WHERE子句查找子表含混合状态值的调拨单头记录

你写的WHERE条件逻辑不成立:同一条调拨明细的status字段不可能同时等于notbooked和booked,所以and连接的条件永远为假,查询不会返回任何结果。

正确查询方案

方案1:EXISTS写法(性能最优,无需去重)

假设你司调拨单头表Table1中代表「全部签收」的状态值为fully_booked,请根据实际业务字段值替换对应内容:

SELECT t1.ref_no, t1.status, t1.site_to
FROM Table1 t1 WITH(NOLOCK)
WHERE 
  -- 过滤单头已标记为全部签收的单据
  t1.status = 'fully_booked'
  -- 校验是否存在未签收的调拨明细
  AND EXISTS (
    SELECT 1 
    FROM Table2 t2 WITH(NOLOCK)
    WHERE t2.ref_no = t1.ref_no
      AND t2.status = 'notbooked'
  )

方案2:聚合统计写法(可查看未签收明细数量)

如果需要同时展示对应单据未签收的货品条数,可以用以下写法:

SELECT t1.ref_no, t1.status, t1.site_to, COUNT(1) AS not_booked_goods_count
FROM Table1 t1 WITH(NOLOCK)
INNER JOIN Table2 t2 WITH(NOLOCK) ON t1.ref_no = t2.ref_no
WHERE 
  t1.status = 'fully_booked'
  AND t2.status = 'notbooked'
GROUP BY t1.ref_no, t1.status, t1.site_to

注意事项

  • WITH(NOLOCK)会触发脏读逻辑,若业务对数据准确性要求较高不建议使用
  • 请务必将代码中fully_booked替换为你司Table1表实际存储的「全部签收」状态枚举值

内容的提问来源于stack exchange,提问作者markymalfunction

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:00:01