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

BigQuery使用临时函数执行UPDATE语句触发左外连接错误

报错原因

这个报错和你的函数本身逻辑无关,是BigQuery对DML语句的隐式关联规则限制导致的:
你定义的临时函数内部包含了对bigquery-public-data.new_york_taxi_trips.taxi_zone_geom表的子查询,当你在UPDATE语句的SET子句中调用该函数时,BigQuery的查询优化器会自动将该逻辑转换为主表collated_data和taxi_zone_geom表的左关联操作。而你关联的判断条件是空间函数ST_DWithin,不属于两张表字段的等值匹配条件,就触发了BigQuery DML语句不支持非等值关联的限制,因此报出连接相关的错误。
单独执行SELECT调用函数没有问题,是因为普通SELECT查询没有DML的这类关联限制,标量子查询可以正常逐行计算返回结果。

解决方案

方案1:直接写关联逻辑执行UPDATE

无需封装函数调用,直接把空间匹配逻辑写到UPDATE的FROM子句中,是最简单的写法:

UPDATE `project-id.datasetid.collated_data` main
SET NEIGHBORHOOD = UPPER(tz_loc.borough)
FROM `bigquery-public-data.new_york_taxi_trips.taxi_zone_geom` tz_loc
WHERE 
  main.collision_date = "2019-10-27" 
  AND main.LAT = 40.705246 
  AND main.LONG = -73.95908
  AND ST_DWithin(tz_loc.zone_geom, ST_GeogPoint(main.LONG, main.LAT), 0)

方案2:通过临时表中转实现等值关联更新

如果你需要复用匹配逻辑,可以先把匹配结果存入临时表,再通过等值关联执行UPDATE,完全符合BigQuery的DML规则:

-- 先查询匹配结果存入临时表
CREATE TEMP TABLE matched_borough AS
SELECT 
  main.collision_date,
  main.LAT,
  main.LONG,
  UPPER(tz_loc.borough) AS borough
FROM `project-id.datasetid.collated_data` main
JOIN `bigquery-public-data.new_york_taxi_trips.taxi_zone_geom` tz_loc
ON ST_DWithin(tz_loc.zone_geom, ST_GeogPoint(main.LONG, main.LAT), 0)
WHERE 
  main.collision_date = "2019-10-27" 
  AND main.LAT = 40.705246 
  AND main.LONG = -73.95908;

-- 用临时表和主表等值关联完成更新
UPDATE `project-id.datasetid.collated_data` main
SET NEIGHBORHOOD = mb.borough
FROM matched_borough mb
WHERE 
  main.collision_date = mb.collision_date
  AND main.LAT = mb.LAT
  AND main.LONG = mb.LONG;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:57:04