标准 sql 查询以获取与另一个表匹配的记录字段(Google BigQuery)

Posted

技术标签:

【中文标题】标准 sql 查询以获取与另一个表匹配的记录字段(Google BigQuery)【英文标题】:standard sql query to get matching record field with another table (Google BigQuery) 【发布时间】:2017-03-24 18:28:58 【问题描述】:

我有两张桌子

1) 表main

   id    phone.type  phone.id
==============================
|   1   | android | adkfjagp |
|       | android | asdfasdf |
|       | iphone  | akfj2341 |
|       | iphone  | ada93519 |
------------------------------

我还有另一个表,其中存储了一堆像这样的 android 手机 ID

2) 表android

==============
|  adkfjagp  |
|   ...      |
--------------

有没有一种方法可以获取主表中的所有行,其中该行包含类型为 android 和 id 的记录也在表 android 中。

【问题讨论】:

【参考方案1】:

下面应该可以了

#standardSQL
SELECT m.*
FROM main AS m
CROSS JOIN (SELECT ARRAY_AGG(id) AS ids  FROM android) AS a
WHERE  (
  SELECT COUNT(1) 
  FROM UNNEST(phone) AS phone 
  WHERE phone.type = 'android' 
  AND phone.id IN UNNEST(a.ids)
) > 0

您可以使用以下虚拟数据对其进行测试

#standardSQL
WITH main AS (
  SELECT 
    1 AS id, 
    [STRUCT<type STRING, id STRING>
      ('android', 'adkfjagp'),
      ('android', 'asdfasdf'),
      ('iphone', 'akfj2341'),
      ('iphone', 'ada93519')
     ] AS phone UNION ALL
  SELECT 
    2 AS id, 
    [STRUCT<type STRING, id STRING>
      ('android', 'adkfjagp1'),
      ('android', 'bbbbbbbb1'),
      ('android', 'akfj2341'),
      ('iphone', 'ada93519')
     ] AS phone
),
android AS (
  SELECT 'adkfjagp' AS id UNION ALL
  SELECT 'bbbbbbbb' 
)
SELECT m.*
FROM main AS m
CROSS JOIN (SELECT ARRAY_AGG(id) AS ids  FROM android) AS a
WHERE  (
  SELECT COUNT(1) 
  FROM UNNEST(phone) AS phone 
  WHERE phone.type = 'android' 
  AND phone.id IN UNNEST(a.ids)
) > 0

【讨论】:

我收到一条错误消息,提示“不支持引用其他表的相关子查询,除非它们可以去相关,例如通过将它们转换为有效的 JOIN。”你知道我怎么能解决这个问题吗?谢谢! 我明白了 - 有道理 - 让我重写它:o) @Isa - 现在试试这个 @Isa - 你现在的情况如何? 谢谢!这看起来不错。但是当我在一个包含大约 1 TB 数据的大型数据集上运行它时,bigquery 似乎在抱怨“在查询执行期间超出了资源。”

以上是关于标准 sql 查询以获取与另一个表匹配的记录字段(Google BigQuery)的主要内容,如果未能解决你的问题,请参考以下文章

如何用sql将两张表的字段名和列值进行匹配?

(访问)在文本字段中搜索与另一个表字段中的字符串匹配的字符串,并在子表单中显示这些匹配记录

过滤与另一个表匹配的查询

在 Bigquery 中,如何使用标准 Sql 过滤 Struct 数组以匹配 Struct 中的多个字段?

当没有匹配的记录时,如何将与另一个表连接的 group_concat 列更改为空字符串而不是 null?

SQL语句 一个表的值与另一个表的字段一致,怎么把两一个表的值作为条件,限定查询的字段