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

如何将两个无关联且行数相同的表的列合并到新表?

解决两个无关联同行数表的列一一合并问题

哈哈,太懂这种“明明看起来应该很简单但就是卡壳”的感觉了!你之前用INNER JOIN B ON 1=1得到的是笛卡尔积——也就是Table A的每一行都会和Table B的每一行配对,结果行数是两个表行数的乘积,肯定不是你要的一一对应效果。

核心思路

要实现两行数据的一一对应,关键是给两个表各自加上一个行号标识,然后用这个行号作为关联条件,这样就能保证第1行A对应第1行B,第2行对应第2行,以此类推。

适用大多数现代数据库的方案(MySQL 8.0+、SQL Server、PostgreSQL、Oracle等)

这些数据库都支持ROW_NUMBER()窗口函数,直接给每个表生成行号后关联即可:

SELECT 
    A_with_row.AColumn AS CColumn1,
    B_with_row.BColumn AS CColumn2
INTO TableC
FROM 
    -- 给Table A添加行号
    (SELECT AColumn, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS row_num FROM TableA) A_with_row
INNER JOIN 
    -- 给Table B添加行号
    (SELECT BColumn, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS row_num FROM TableB) B_with_row
ON A_with_row.row_num = B_with_row.row_num;

注意事项:

  • ORDER BY (SELECT NULL)是在没有明确排序依据时的写法,数据库会按默认存储顺序生成行号。如果你的表有天然的排序键(比如自增主键、创建时间),一定要换成这个列,比如ORDER BY id,这样能确保配对顺序完全符合预期,避免存储顺序变化导致的配对错误。
  • 如果你的数据库不支持SELECT ... INTO语法,可以换成CREATE TABLE TableC AS SELECT ...的形式。

针对MySQL 5.x等不支持窗口函数的数据库

可以用用户变量来手动生成行号:

-- 初始化行号变量
SET @row_num_a = 0;
SET @row_num_b = 0;

SELECT 
    A_with_row.AColumn AS CColumn1,
    B_with_row.BColumn AS CColumn2
INTO TableC
FROM 
    (SELECT AColumn, @row_num_a := @row_num_a + 1 AS row_num FROM TableA) A_with_row
INNER JOIN 
    (SELECT BColumn, @row_num_b := @row_num_b + 1 AS row_num FROM TableB) B_with_row
ON A_with_row.row_num = B_with_row.row_num;

这样执行后,Table C里的CColumn1和CColumn2就会严格按照你预期的一一对应啦!

内容的提问来源于stack exchange,提问作者Riccardo Di Stefano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:49:20