google-bigquery - 临时函数的 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)
并返回“BROOKLYN” - 这很棒。
但是,当我尝试使用以下方法更新一个值(并且我特别针对此处的单行进行测试)时:
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 个参数并返回一个字符串,那么为什么它突然想要一个连接呢?
解决方案
您遇到 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
表:
推荐阅读
- javascript - 如何更新古腾堡中的块图标
- css - GSAP 中风动画 strokeDashoffset 无法正常工作
- c - 我有一个关于发送信号的问题
- sql-server - 如何更有效地设计我的数据库和实体关系图?
- automationanywhere - 找不到“消息正文”文本框。“搜索条件”不匹配。(TYPE_1001)
- javascript - SetState 在 componentDidMount 中调用后不会重新渲染组件
- r - 根据后续行的内容有条件地替换值
- flash - 如何从网站下载 Flash 视频?
- javascript - 我试图给大写,但它不工作
- javascript - 这段 Swift 代码的 JavaScript 等价物是什么?