如何在大查询中使用 ST_CONTAINS 加入地理列

Jak*_*wen 0 gis google-bigquery

我有一个 BigQuery 表,其地址包括 Lat/Lng 和其他 BQ 表,其中包含从人口普查 shapefile 导入的工作几何定义。对于地址表中的每一行,我试图查找包含它的几何行。

以下查询是我查找 INDIVIDUAL lat/lng 工作正常:

SELECT SLDLST FROM `geographies.tl_2018_sldl_*` sldl WHERE ST_CONTAINS(sldl.geom, ST_GEOGPOINT(-95.221080, 38.974500));
Run Code Online (Sandbox Code Playgroud)

但是当我尝试抽象成一个连接时

SELECT 
  address_id,
  SLDLST
FROM `launchpad-239920.address_standardization.temp_delete_geo_match_sample` ssgolden
LEFT JOIN `geographies.tl_2018_sldl_*` sldl ON ST_CONTAINS(sldl.geom, ST_GEOGPOINT(ssgolden.longitude, ssgolden.latitude));
Run Code Online (Sandbox Code Playgroud)

我收到错误消息: “如果不满足连接两侧字段相等的条件,则不能使用 LEFT OUTER JOIN。”

如何重构我的连接查询以便能够为每个地址提取匹配的地理位置?

Mik*_*ant 6

下面是 BigQuery 标准 SQL

如果您想在输出中保留不匹配的地址 - 您可以在下面使用

#standardSQL
WITH matched_addresses AS (
  SELECT 
    address_id,
    SLDLST
  FROM `launchpad-239920.address_standardization.temp_delete_geo_match_sample` ssgolden
  JOIN `geographies.tl_2018_sldl_X` sldl 
  ON ST_CONTAINS(sldl.geom, ST_GEOGPOINT(ssgolden.longitude, ssgolden.latitude)) 
)
SELECT * FROM matched_addresses UNION ALL 
SELECT address_id, NULL 
FROM `launchpad-239920.address_standardization.temp_delete_geo_match_sample`
WHERE NOT address_id IN (SELECT address_id FROM matched_addresses)   
Run Code Online (Sandbox Code Playgroud)

但如果你只对匹配感兴趣 - 使用下面的一个

#standardSQL
WITH matched_addresses AS (
  SELECT 
    address_id,
    SLDLST
  FROM `launchpad-239920.address_standardization.temp_delete_geo_match_sample` ssgolden
  JOIN `geographies.tl_2018_sldl_X` sldl 
  ON ST_CONTAINS(sldl.geom, ST_GEOGPOINT(ssgolden.longitude, ssgolden.latitude)) 
)
SELECT * FROM matched_addresses  
Run Code Online (Sandbox Code Playgroud)