如何一次性将多表按唯一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
相关产品推荐
相关产品推荐

