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

如何一次性将多表按唯一primary_isbn13合并至MySQL主表?

一次性合并多表并插入唯一primary_isbn13数据到table_main

可以通过UNION ALL合并多表数据,再结合窗口函数对primary_isbn13去重,最后一次性插入到table_main,同时过滤掉已存在的记录。具体代码如下:

INSERT INTO `table_main`
SELECT t.*
FROM (
    -- 先合并多表并标记来源,再按primary_isbn13去重(可自定义优先级)
    SELECT *
    FROM (
        SELECT *, 
               ROW_NUMBER() OVER (PARTITION BY `primary_isbn13` ORDER BY 
                   CASE `source_table` 
                       WHEN 'table_A' THEN 1 
                       WHEN 'table_B' THEN 2 
                       WHEN 'table_C' THEN 3 
                   END) AS rn
        FROM (
            SELECT *, 'table_A' AS `source_table` FROM `table_A`
            UNION ALL
            SELECT *, 'table_B' AS `source_table` FROM `table_B`
            UNION ALL
            SELECT *, 'table_C' AS `source_table` FROM `table_C`
        ) AS combined_tables
    ) AS ranked_tables
    WHERE rn = 1 -- 每个primary_isbn13仅保留优先级最高的一行
) AS t
WHERE NOT EXISTS (
    SELECT 1 FROM `table_main` X WHERE t.`primary_isbn13` = X.`primary_isbn13`
);

关键说明:

  • UNION ALL用来快速合并多表数据,比UNION更高效(不会自动去重,我们后续手动处理)
  • 窗口函数ROW_NUMBER()按primary_isbn13分组,通过CASE定义表的优先级(比如优先保留table_A的数据,再到table_B、table_C),每组里优先级最高的行编号为1
  • WHERE rn = 1确保每个primary_isbn13只留一条记录
  • 外层的NOT EXISTS用来过滤掉table_main中已存在的primary_isbn13,避免重复插入

如果不需要指定优先级,只是随机保留一条的话,可以把ORDER BY里的CASE部分换成ORDER BY RAND(),但建议尽量明确优先级,保证结果可预期。

内容的提问来源于stack exchange,提问作者user1233894

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 17:42:36