标准 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)的主要内容,如果未能解决你的问题,请参考以下文章
(访问)在文本字段中搜索与另一个表字段中的字符串匹配的字符串,并在子表单中显示这些匹配记录
在 Bigquery 中,如何使用标准 Sql 过滤 Struct 数组以匹配 Struct 中的多个字段?