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

如何在SQL的IN语句中保留重复值以返回对应多条记录?

如何基于含重复old_id的列表查询并保留重复行结构

你的问题出在IN子句会自动去重——即使你在IN列表里写了两次'3333',数据库也只会将其视为一个查询条件,返回该old_id对应的唯一匹配行,不会重复输出。要得到和Excel行数一致的结果,需要把Excel里的所有old_id(包括重复项)作为一个完整的数据集,再和目标表做关联查询。

解决方案1:用VALUES/UNION ALL构造临时数据集

直接复刻Excel中的old_id列表(保留重复项),通过JOIN关联目标表,这样就能保留原始的6行结构,同时匹配每个old_id对应的所有new_id。

适用于PostgreSQL、SQL Server等支持VALUES子句的数据库:

SELECT t.new_id, src.old_id, t.status
FROM (
    VALUES
        ('1111'),
        ('2222'),
        ('3333'),
        ('3333'),
        ('4444'),
        ('5555')
) AS src(old_id)
JOIN your_table t ON t.old_id = src.old_id
ORDER BY src.old_id DESC;

适用于MySQL(8.0之前版本):

MySQL早期版本不支持直接用VALUES构造子查询,可改用UNION ALL拼接:

SELECT t.new_id, src.old_id, t.status
FROM (
    SELECT '1111' AS old_id UNION ALL
    SELECT '2222' UNION ALL
    SELECT '3333' UNION ALL
    SELECT '3333' UNION ALL
    SELECT '4444' UNION ALL
    SELECT '5555'
) AS src
JOIN your_table t ON t.old_id = src.old_id
ORDER BY src.old_id DESC;

解决方案2:导入Excel数据到临时表(适合大数据量)

如果Excel里的old_id数量很多,手动写VALUES/UNION ALL效率低,可以将Excel数据导入数据库的临时表(比如temp_old_ids),再执行关联查询:

SELECT t.new_id, temp.old_id, t.status
FROM temp_old_ids temp
JOIN your_table t ON t.old_id = temp.old_id
ORDER BY temp.old_id DESC;

注意事项

  • 检查你的原始SQL:WHERE子句里写的是id in (...),但根据需求应该是old_id in (...),确认字段名是否正确,避免查询条件错误。
  • 如果同一个old_id对应多个new_id,JOIN会返回所有匹配的组合,正好满足你展示不同new_id的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 06:18:20