sql - BigQuery 根据(Array CONTAINED IN Array)条件连接 2 个表

标签 sql join google-bigquery unnest

我正在努力实现以下目标。假设我有两个表:

WITH table_1 as (
SELECT
* FROM UNNEST([
  STRUCT([1] as A, [2,3,4] as B),
  STRUCT([2],[6,7])
  ])
)

enter image description here

表 2:

WITH example as (
SELECT
* FROM UNNEST([
  STRUCT([1,2] as C, [77] as D),
  STRUCT([3,4],[88]),
  STRUCT([4],[99])
  ])
)

enter image description here

我想根据以下条件合并table_1和table_2:C的所有值都必须在B中:

从 table_1 LEFT JOIN table_2 ON C CONTAINED IN B 中选择 A、C、D

这将产生下表:

enter image description here

我的问题是是否/如何才能获得期望的结果。我无法为两个数组编写 CONTAINED IN 语句作为 LEFT JOIN 语句的条件。另一项要求是表 1 包含 1 亿行,表 2 包含 25,000 行。因此,解决方案必须是有效的。我知道这增加了问题的难度......:P

我们将非常感谢您的帮助!

最佳答案

WITH table_1 as (
SELECT
* FROM UNNEST([
  STRUCT([1] as A, [2,3,4] as B),
  STRUCT([2],[6,7])
  ])
),
table_2 as (
SELECT
* FROM UNNEST([
  STRUCT([1,2] as C, [77] as D),
  STRUCT([3,4],[88]),
  STRUCT([4],[99])
  ])
)

SELECT table_1.A, table_2.C, table_2.D
FROM table_1 , table_2 , UNNEST([
                      (SELECT ARRAY_LENGTH(table_2.C) - COUNT(1) 
                      FROM UNNEST(table_2.C) AS col_c 
                      JOIN UNNEST(table_1.B)  AS col_b 
                      ON col_c = col_b)]) AS x
WHERE x = 0

这会产生所需的输出。

关于sql - BigQuery 根据(Array CONTAINED IN Array)条件连接 2 个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59967207/

相关文章:

mysql - 如何更改我的 sql 以在 mysql 中的 MySql 存储过程中循环?

sql - 在grails准备好的语句上使用like时引发异常

android - Select with union all 语句抛出异常: no such column : borrow

mysql - #1060 - 重复的列名

google-bigquery - 具有多个分隔符的 BigQuery SPLIT

google-analytics - visitNumber 在 Google Analytics 的 BigQuery Export 中被重置

sql - 字符串或二进制数据将被截断。该语句已终止。 (长度相同)

Python pandas read_sql 返回生成器对象

php - 性能问题 - 在额外的表或 php 数组中保存国家名称和其他属性?

sql - BigQuery - 将 TIMESTAMP 转换为 HH :MM:SS and then identify TIME_DIFF