临时函数的 BigQuery LEFT OUT JOIN 错误?
Posted
技术标签:
【中文标题】临时函数的 BigQuery LEFT OUT JOIN 错误?【英文标题】:BigQuery LEFT OUT JOIN error for a temp function? 【发布时间】:2021-10-11 19:49:38 【问题描述】:我有一个在 BigQuery 中创建的表。
在该表中,我在字段中有一些占位符值。
然后我想我可以简单地更新占位符值,所以我写了一个小临时函数
CREATE TEMP FUNCTION getBoroughFromCoords(longitude FLOAT64, latitude FLOAT64 )
RETURNS STRING
AS ((SELECT CAST(UPPER(tz_loc.borough)as STRING) FROM `bigquery-public-data.new_york_taxi_trips.taxi_zone_geom` tz_loc WHERE (ST_DWithin(tz_loc.zone_geom, ST_GeogPoint(longitude, latitude),0)) )
);
并像这样sql select getBoroughFromCoords(-73.95908, 40.705246)
对其进行了测试,它返回了“***LYN”——这很棒。
但是当我尝试更新一个值(并且我在这里专门针对单行进行测试)时,使用:
UPDATE `project-id.datasetid.collated_data`
SET NEIGHBORHOOD = (select getBoroughFromCoords(LONG, LAT))
WHERE collision_date = "2019-10-27" AND LAT = 40.705246 AND LONG = -73.95908
我收到错误“如果没有连接两侧的字段相等的条件,就不能使用 LEFT OUTER JOIN。”
我不明白为什么?我的意思是,这个功能是独立的,对吗?它只接受 2 个参数并返回一个字符串,那为什么突然要加入呢?
【问题讨论】:
【参考方案1】:您遇到 LEFT OUTER JOIN 错误,因为您没有在子查询中将值传递给 LONG 和 LAT。要解决此问题,您应该在查询开始时为这些变量设置值。
DECLARE long_var, lat_var FLOAT64;
SET long_var = -73.95908;
SET lat_var = 40.705246;
为了测试这一点,我刚刚创建了一个带有虚拟值的表,足以满足您的 WHERE 条件。
使用的查询:
DECLARE long_var, lat_var FLOAT64;
SET long_var = -73.95908;
SET lat_var = 40.705246;
CREATE TEMP FUNCTION getBoroughFromCoords(longitude FLOAT64, latitude FLOAT64 )
RETURNS STRING
AS ((SELECT CAST(UPPER(tz_loc.borough)as STRING) FROM `bigquery-public-data.new_york_taxi_trips.taxi_zone_geom` tz_loc
WHERE (ST_DWithin(tz_loc.zone_geom, ST_GeogPoint(longitude, latitude),0)))
);
UPDATE `project-id.dataset_id.collated_data`
SET NEIGHBORHOOD = (select getBoroughFromCoords(long_var, lat_var))
WHERE collision_date = "2019-10-27" AND LAT = lat_var AND LONG = long_var
输出:
查询project-id.dataset_id.collated_data
表:
【讨论】:
答案是完全正确的——我想我可以用它来帮助我,但我不能:(但这并不能阻止答案是正确的以上是关于临时函数的 BigQuery LEFT OUT JOIN 错误?的主要内容,如果未能解决你的问题,请参考以下文章