如何用单条带子查询的T-SQL语句实现现有两段SQL的结果?
单条SQL实现重复custprod记录查询
以下两种写法都能实现你原来两段SQL的效果:
方式一:使用窗口函数(性能更优)
窗口函数只需扫描一次表,效率更高:
SELECT convert(varchar(10),custID) + '-' + convert(varchar(4),prodID) as custprod, * FROM ( SELECT *, COUNT(*) OVER(PARTITION BY convert(varchar(10),custID) + '-' + convert(varchar(4),prodID)) AS cnt FROM tbl_cust WHERE YEAR(mdate) = 2023 ) t WHERE cnt > 1 ORDER BY custprod
方式二:使用IN子查询(与原逻辑对齐)
该写法和你原来的临时表逻辑一致,通过子查询先筛选出重复的custprod:
SELECT convert(varchar(10),custID) + '-' + convert(varchar(4),prodID) as custprod, * FROM tbl_cust WHERE YEAR(mdate) = 2023 AND convert(varchar(10),custID) + '-' + convert(varchar(4),prodID) IN ( SELECT convert(varchar(10),custID) + '-' + convert(varchar(4),prodID) FROM tbl_cust WHERE YEAR(mdate) = 2023 GROUP BY convert(varchar(10),custID) + '-' + convert(varchar(4),prodID) HAVING COUNT(*) > 1 ) ORDER BY custprod
说明
- 两种写法都会返回2023年数据中
custprod重复的所有记录,排序规则和原SQL一致。 - 子查询中务必加上
YEAR(mdate) = 2023过滤条件,避免扫描全表,提升查询效率。
内容的提问来源于stack exchange,提问作者DB_B
相关产品推荐
相关产品推荐

