临时函数的 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 错误?的主要内容,如果未能解决你的问题,请参考以下文章

错误:BigQuery 不支持临时表

如何使用 API 在 BigQuery 中获取临时表的名称

是否可以在内存中本地创建和运行 bigquery 临时表?

postgres - 使用提供临时表的函数创建视图

使用 Python API 获取 BigQuery 临时表“目标表”

BigQuery 未在 LEFT JOIN 中返回缺失的 NULL 行