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

