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

Isa*_*Isa 5 sql google-bigquery

我有两张桌子

1) 表 main

   id    phone.type  phone.id
==============================
|   1   | android | adkfjagp |
|       | android | asdfasdf |
|       | iphone  | akfj2341 |
|       | iphone  | ada93519 |
------------------------------
Run Code Online (Sandbox Code Playgroud)

我有另一个表,它存储了一堆这样的安卓手机 ID

2) 表 android

==============
|  adkfjagp  |
|   ...      |
--------------
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*ant 2

下面应该可以

#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
Run Code Online (Sandbox Code Playgroud)

你可以用下面的虚拟数据来测试它

#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
Run Code Online (Sandbox Code Playgroud)