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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 18:31:12