如何合并两张SQL表并将结果追加至第三张表且保留原表数据
最高效SQL实现方案
直接使用INSERT INTO ... SELECT搭配交叉连接完成,全程在数据库内核执行,没有数据往返应用层的开销,且不会修改表1、表2的原有数据,是当前场景下性能最优的实现方式。
前提(绝大多数业务场景默认满足)
表3的ID字段设置为自增主键(MySQL的AUTO_INCREMENT、PostgreSQL的SERIAL/IDENTITY、SQL Server的IDENTITY等),不需要手动赋值ID。
执行SQL
INSERT INTO 表3 (NAME, ITEM) SELECT t1.NAME, t2.ITEM FROM 表1 t1 CROSS JOIN 表2 t2;
逻辑说明
- 交叉连接
CROSS JOIN会生成两张表的笛卡尔积,表1只有1条John的记录,关联表2的3条商品记录后,正好生成3条「John+对应商品」的目标数据 - 插入操作只写入表3,对表1、表2只有只读访问,不会修改原有数据
- 表3的ID由数据库自增逻辑自动生成,会顺着原有最大ID 2自动生成3、4、5,完全符合预期结果
兼容场景(表3ID未设置自增)
如果表3没有配置自增ID,可以用窗口函数手动计算新ID再插入:
INSERT INTO 表3 (ID, NAME, ITEM) SELECT (SELECT MAX(ID) FROM 表3) + ROW_NUMBER() OVER (ORDER BY t2.ID) AS new_id, t1.NAME, t2.ITEM FROM 表1 t1 CROSS JOIN 表2 t2;
内容的提问来源于stack exchange,提问作者tewerty
相关产品推荐
相关产品推荐

