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
相关产品推荐
相关产品推荐

