如何不修改现有表通过查询insert duplicate rows 实现各科目指定重复行数输出
解决方案
可以通过交叉连接自定义行数的临时序列实现,无需修改原表,全查询逻辑即可完成需求:
通用SQL写法(兼容 MySQL 8.0+、PostgreSQL、SQL Server 等主流数据库)
SELECT t.* FROM school_data t -- 构造1-3的序列临时表 CROSS JOIN ( SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 ) AS num_sequence WHERE CASE WHEN t.subjects = 'Foreign Language' THEN num_sequence.n <= 3 ELSE num_sequence.n <= 2 END -- 可选排序,保证相同科目数据连续展示 ORDER BY t.student_name, num_sequence.n;
实现逻辑
- 先通过
UNION ALL构造包含1、2、3三个值的临时序列表 - 原表和序列表交叉连接后,每条原数据会先生成3条重复记录
- 通过
WHERE条件过滤:普通科目只保留前2条记录,外语科目保留全部3条,刚好符合要求
PostgreSQL 简化写法
如果使用PostgreSQL,可以用内置的generate_series函数进一步简化代码:
SELECT t.* FROM school_data t CROSS JOIN generate_series(1, CASE WHEN subjects = 'Foreign Language' THEN 3 ELSE 2 END) ORDER BY t.student_name;
内容的提问来源于stack exchange,提问作者Jake Wagner
相关产品推荐
相关产品推荐

