如何通过SQL将Table-1两同数据类型列合并为Table-2单列
需求实现SQL
你需要实现两列纵向合并+重新生成连续自增主键的效果,以下是可直接运行的SQL写法,结果完全匹配给出的预期输出:
通用标准SQL写法(适配MySQL 8.0+、PostgreSQL、SQL Server、Oracle 12c+等支持窗口函数的数据库)
直接通过查询生成目标表Table-2:
CREATE TABLE `Table-2` AS SELECT ROW_NUMBER() OVER (ORDER BY col_type, sort_rule) AS id, merged_name AS name FROM ( -- 取原表正式name列,标记列优先级为1(优先排在前面) SELECT id AS sort_rule, name AS merged_name, 1 AS col_type FROM `Table-1` UNION ALL -- 取原表aka-name列,标记列优先级为2 SELECT -id AS sort_rule, -- 用负号实现倒序匹配示例排序 `aka-name` AS merged_name, 2 AS col_type FROM `Table-1` ) t ORDER BY col_type, sort_rule;
旧版MySQL 5.x兼容写法(不支持窗口函数)
借助InnoDB表的自增主键特性自动生成连续id,先建表再按顺序插入数据即可:
-- 第一步:创建目标表结构 CREATE TABLE `Table-2` ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 第二步:按指定顺序插入数据,自增id会自动按插入顺序生成连续编号 INSERT INTO `Table-2` (name) -- 先插入原表正式name,按原id升序排列 SELECT name FROM `Table-1` ORDER BY id ASC UNION ALL -- 再插入原表aka-name,按原id倒序排列,匹配示例输出顺序 SELECT `aka-name` FROM `Table-1` ORDER BY id DESC;
注意事项
- 原表列名
aka-name包含横杠,编写SQL时需要用反引号(MySQL/MariaDB)或双引号(PostgreSQL/Oracle/SQL Server)包裹转义,避免被数据库识别为减法运算报错 - 纵向合并请用
UNION ALL而非UNION:UNION会自动对结果去重,如果原表name和aka-name存在同名值会被错误删除,同时去重操作也会带来额外性能开销 - 如果需要调整aka-name的排序规则,只要修改第二个查询的
ORDER BY子句即可:比如需要aka-name和原name按原id顺序一一对应排列,把第二个排序规则的id DESC改成id ASC即可。
内容的提问来源于stack exchange,提问作者Vignesh
相关产品推荐
相关产品推荐

