如何编写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
相关产品推荐
相关产品推荐

