首页 > 解决方案 > 临时函数的 BigQuery LEFT OUT JOIN 错误?

问题描述

我有一个在 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)并返回“BR​​OOKLYN” - 这很棒。

但是,当我尝试使用以下方法更新一个值(并且我特别针对此处的单行进行测试)时:

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 个参数并返回一个字符串,那么为什么它突然想要一个连接呢?

标签: google-bigquery

解决方案


您遇到 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表:

在此处输入图像描述


推荐阅读