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

SQL Server如何筛选仅存在SaleTypeID=2记录的STKNBR

问题背景

现有数据表dbo.RawDump,包含STKNBR、SaleTypeID两个字段,样例数据如下:

STKNBR                           SaleTypeID
1010186732                        2
1010186732                        1
1010188780                        2
1010190707                        1
1010190707                        2
1010190350                        2
1010190446                        2
1010190647                        2

需求为筛选出所有关联记录中SaleTypeID仅为2的STKNBR,排除同时存在SaleTypeID=1和SaleTypeID=2记录的STKNBR。

之前尝试的查询语句无法生效,原因是该语句是行级过滤逻辑:仅判断单行数据的SaleTypeID值,只要某行的SaleTypeID=2就会被返回,完全不会校验同一个STKNBR下是否存在其他SaleTypeID=1的关联记录,因此无法排除同时绑定两类销售类型的编号。
原有错误语句如下:

SELECT STKNBR, SaleTypeID
FROM dbo.RawDump lm 
WHERE  lm.SaleTypeID = 2 AND lm.SaleTypeID <> 1
正确SQL实现

以下两种写法均可满足需求,返回结果完全一致:

写法1:分组聚合校验

按STKNBR分组后,统计每个编号下不同销售类型的存在情况,筛选出无SaleTypeID=1记录、且存在SaleTypeID=2记录的编号即可:

SELECT STKNBR
FROM dbo.RawDump
GROUP BY STKNBR
HAVING 
  -- 不存在SaleTypeID=1的记录
  SUM(CASE WHEN SaleTypeID = 1 THEN 1 ELSE 0 END) = 0
  -- 确保有SaleTypeID=2的记录
  AND SUM(CASE WHEN SaleTypeID = 2 THEN 1 ELSE 0 END) > 0

针对给出的样例数据,该语句会返回1010188780、1010190350、1010190446、1010190647四个符合要求的STKNBR。

写法2:NOT EXISTS反查

先提取所有带SaleTypeID=2的记录,再排除掉同编号下存在SaleTypeID=1记录的条目:

SELECT DISTINCT t1.STKNBR
FROM dbo.RawDump t1
WHERE t1.SaleTypeID = 2
AND NOT EXISTS (
  SELECT 1
  FROM dbo.RawDump t2
  WHERE t2.STKNBR = t1.STKNBR
    AND t2.SaleTypeID = 1
)

性能提示:如果表数据量较大,可以为STKNBR、SaleTypeID字段建立联合索引,能大幅提升上述查询的运行效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:45:32