BigQuery Соединение 2 таблиц на основе условия (Array CONTAINED IN Array) - PullRequest
2 голосов
/ 29 января 2020

Я пытаюсь добиться следующего. Предположим, у меня есть две таблицы:

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:

SELECT A, C, D FROM table_1 LEFT JOIN table_2 ON C CONTAINED IN B

Это приведет к в следующей таблице:

enter image description here

Мой вопрос: возможно ли получить желаемый результат? Я не смог написать оператор CONTAINED IN для двух массивов в качестве условия для оператора LEFT JOIN. Еще одним требованием является то, что таблица 1 содержит 100 миллионов строк, а таблица 2 - 25 тысяч. Поэтому решение должно быть эффективным. Я знаю, что это увеличивает сложность вопроса ...: P

Ваша помощь будет принята с благодарностью!

1 Ответ

2 голосов
/ 29 января 2020
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

, что приводит к желаемому результату.

...