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

如何在数仓入库脚本中并行加载多表且避免重复,无需使用overwrite

多表并行无重复插入实现方案

可以使用INSERT ALL实现你需要的同查询并行加载多张表、无重复数据、无需overwrite的需求,你之前写法的问题在于多表插入时不需要给每个INTO单独加SELECT子句,同时可以通过CTE提前计算所有表的主键存在性,避开WHEN子句不能使用子查询的限制。

核心实现逻辑

  1. 用CTE仅扫描一次源文件,提前计算所有待插入表的主键是否已存在的标志位,所有去重逻辑在这一步批量完成
  2. 在INSERT ALL后依次声明每个表的插入规则,用提前计算好的标志位做插入判断,无需在WHEN中写子查询
  3. 所有表的插入操作在同一个查询任务中并行执行,源文件仅加载一次,性能优于单表分次插入

示例代码

假设你需要插入TEMP、TABLE2、TABLE3、TABLE4四张表,参考写法如下:

WITH stg_data AS (
    SELECT
        -- 提取源文件字段
        $1 AS id,
        $2 AS title_name,
        $3 AS table2_col,
        $4 AS table3_col,
        -- 提前计算各表主键是否不存在(返回布尔值用于后续插入判断)
        NOT EXISTS(SELECT 1 FROM TEMP WHERE PKEY = $1) AS temp_pkey_not_exists,
        NOT EXISTS(SELECT 1 FROM TABLE2 WHERE T2_PKEY = $1) AS t2_pkey_not_exists,
        NOT EXISTS(SELECT 1 FROM TABLE3 WHERE T3_PKEY = $1) AS t3_pkey_not_exists,
        NOT EXISTS(SELECT 1 FROM TABLE4 WHERE T4_PKEY = $1) AS t4_pkey_not_exists
    FROM @azure_stg/mti_test.csv (FILE_FORMAT=>'CSV')
)
INSERT ALL
-- 每张表的插入规则,用提前算好的标志位判断是否插入
WHEN temp_pkey_not_exists THEN
    INTO TEMP (PKEY, TITLE) VALUES (id, title_name)
WHEN t2_pkey_not_exists THEN
    INTO TABLE2 (T2_PKEY, COLUMN2) VALUES (id, table2_col)
WHEN t3_pkey_not_exists THEN
    INTO TABLE3 (T3_PKEY, COLUMN3) VALUES (id, table3_col)
WHEN t4_pkey_not_exists THEN
    INTO TABLE4 (T4_PKEY, COLUMN4) VALUES (id, title_name)
SELECT * FROM stg_data;

注意事项

  • 如果同一条源数据需要插入所有符合条件的表,使用INSERT ALL即可;如果要求每条源数据仅匹配第一个符合的WHEN条件插入对应表,将开头的INSERT ALL替换为INSERT FIRST
  • 如果不同表的主键字段不是同一个,仅需调整CTE中NOT EXISTS的关联条件即可
  • 该方案全程是追加写入逻辑,不需要使用overwrite,也不会产生重复数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:06:03