SQL(SSMS)查询保留重复Customer_ID结果的实现需求
解决SSMS中传入重复Customer_ID返回对应重复结果的问题
你的问题根源在于IN子句的特性:它只会检查值是否存在于目标集合中,自动忽略重复的输入值,因此哪怕你传入多次相同的Customer_ID,也只会返回唯一匹配的行。要保留输入的重复项并返回对应结果,推荐以下两种适用于大量数据的可靠方案:
方案1:使用表值构造函数+CTE(适合中等数据量)
直接通过CTE构造包含所有重复ID的临时数据集,结合JOIN关联主表,同时保留原始输入顺序:
WITH InputIDs AS ( SELECT Customer_ID, -- 生成序号以保留原始输入顺序 RowNum = ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM (VALUES (1), (2), (51), (11), (23), (2), (11) ) AS t(Customer_ID) ) SELECT i.Customer_ID, d.Make, d.Model FROM InputIDs i INNER JOIN [Database] d ON i.Customer_ID = d.Customer_ID ORDER BY i.RowNum;
这个方案无需额外创建对象,直接嵌入查询中,适合数千条ID的场景,能精准保留你传入的重复项和顺序。
方案2:使用临时表(适合超大量数据)
如果你的ID数量达到上万甚至更多,临时表可以通过添加索引优化关联性能,是更稳定的选择:
-- 创建带自增序号的临时表,用于存储输入ID和顺序 CREATE TABLE #InputIDs ( RowNum INT IDENTITY(1,1) PRIMARY KEY, Customer_ID INT NOT NULL ); -- 插入所有包含重复项的Customer_ID INSERT INTO #InputIDs (Customer_ID) VALUES (1), (2), (51), (11), (23), (2), (11); -- 关联主表获取结果,按输入顺序排序 SELECT i.Customer_ID, d.Make, d.Model FROM #InputIDs i INNER JOIN [Database] d ON i.Customer_ID = d.Customer_ID ORDER BY i.RowNum; -- 清理临时表 DROP TABLE #InputIDs;
临时表的主键索引能大幅提升大数量下的JOIN效率,确保查询稳定运行。
额外说明
- 如果需要保留那些在主表中没有匹配记录的输入ID(返回Make/Model为NULL),只需将
INNER JOIN替换为LEFT JOIN即可。 - 两种方案都能严格按照你传入的ID顺序返回结果,解决原查询中CASE排序无法生效的问题(原CASE中相同Customer_ID会被分配相同的排序值,导致顺序混乱)。
内容的提问来源于stack exchange,提问作者Prez7112
相关产品推荐
相关产品推荐

