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

BigQuery使用INNER JOIN基于另一表数据删除行报错问题咨询

解决BigQuery中关联删除的语法错误问题

嘿,我来帮你搞定这个BigQuery的DELETE语法问题!你遇到的报错是因为BigQuery的DELETE语句不支持直接在FROM子句后使用INNER JOIN,它的语法规范要求通过WHERE子句里的关联条件(比如EXISTS或IN)来匹配需要删除的行。

你的需求是从历史表中删除输入表转换后存在的日期行,我给你调整了两种可行的写法:

方案1:使用EXISTS子句关联删除

这种写法通过检查历史表的行是否在输入表转换后的日期集合中,来决定是否删除:

DELETE FROM `datapool-prt-supplychain-wrk.TRANSPORTS_DATA.tbl_historico_tb_rota` AS a
WHERE EXISTS (
  SELECT 1
  FROM (
    SELECT DISTINCT 
      CAST( 
        CONCAT(
          RIGHT(data,4),'-', 
          CASE 
            WHEN LENGTH(data) = 8 THEN CONCAT('0',SUBSTR(data ,3,1),'-0',LEFT(data ,1)) 
            WHEN LENGTH(data) = 9 AND SUBSTR(data,3,1) = "-" THEN CONCAT('0',SUBSTR(data ,4,1),"-",LEFT(data ,2)) 
            WHEN LENGTH(data) = 9 THEN CONCAT(SUBSTR(data ,3,2),'-0',LEFT(data ,1)) 
            WHEN LENGTH(data) = 10 THEN CONCAT(SUBSTR(data,4,2),'-',LEFT(data,2)) 
            ELSE '1900-01-01' 
          END 
        ) AS DATE 
      ) AS data 
    FROM `datapool-prt-supplychain-wrk.TRANSPORTS_DATA.tbl_input_tb_rota`
  ) AS b
  WHERE b.data = a.data 
    AND b.data IS NOT NULL
)

方案2:使用IN子句匹配删除

如果逻辑更简单,也可以直接用IN子句来匹配需要删除的日期:

DELETE FROM `datapool-prt-supplychain-wrk.TRANSPORTS_DATA.tbl_historico_tb_rota` AS a
WHERE a.data IN (
  SELECT DISTINCT 
    CAST( 
      CONCAT(
        RIGHT(data,4),'-', 
        CASE 
          WHEN LENGTH(data) = 8 THEN CONCAT('0',SUBSTR(data ,3,1),'-0',LEFT(data ,1)) 
          WHEN LENGTH(data) = 9 AND SUBSTR(data,3,1) = "-" THEN CONCAT('0',SUBSTR(data ,4,1),"-",LEFT(data ,2)) 
          WHEN LENGTH(data) = 9 THEN CONCAT(SUBSTR(data ,3,2),'-0',LEFT(data ,1)) 
          WHEN LENGTH(data) = 10 THEN CONCAT(SUBSTR(data,4,2),'-',LEFT(data,2)) 
          ELSE '1900-01-01' 
        END 
      ) AS DATE 
    ) AS data 
  FROM `datapool-prt-supplychain-wrk.TRANSPORTS_DATA.tbl_input_tb_rota`
  WHERE data IS NOT NULL
)

可选优化:用临时表简化逻辑

如果你的日期转换逻辑比较复杂,还可以先把转换后的日期存入临时表,再关联删除,这样代码可读性更高:

-- 先创建临时表存储转换后的有效日期
CREATE TEMP TABLE temp_target_dates AS
SELECT DISTINCT 
  CAST( 
    CONCAT(
      RIGHT(data,4),'-', 
      CASE 
        WHEN LENGTH(data) = 8 THEN CONCAT('0',SUBSTR(data ,3,1),'-0',LEFT(data ,1)) 
        WHEN LENGTH(data) = 9 AND SUBSTR(data,3,1) = "-" THEN CONCAT('0',SUBSTR(data ,4,1),"-",LEFT(data ,2)) 
        WHEN LENGTH(data) = 9 THEN CONCAT(SUBSTR(data ,3,2),'-0',LEFT(data ,1)) 
        WHEN LENGTH(data) = 10 THEN CONCAT(SUBSTR(data,4,2),'-',LEFT(data,2)) 
        ELSE '1900-01-01' 
      END 
    ) AS DATE 
  ) AS data 
FROM `datapool-prt-supplychain-wrk.TRANSPORTS_DATA.tbl_input_tb_rota`
WHERE data IS NOT NULL;

-- 从历史表删除匹配的行
DELETE FROM `datapool-prt-supplychain-wrk.TRANSPORTS_DATA.tbl_historico_tb_rota` AS a
WHERE EXISTS (
  SELECT 1 FROM temp_target_dates AS b WHERE b.data = a.data
);

内容的提问来源于stack exchange,提问作者André Cordeiro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 08:42:43