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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 04:06:05