在 BigQuery 中加入 2 列结构

Posted

技术标签:

【中文标题】在 BigQuery 中加入 2 列结构【英文标题】:Join on a 2 Column Struct in BigQuery 【发布时间】:2021-05-12 01:03:10 【问题描述】:

我想在大查询中使用结构将平面表连接到表上,但该表需要连接结构中的 2 列。有没有办法做到这一点?以下是示例数据和我尝试过的数据。

prices_table

| row | id1       | id2       | price  |
| --- | --------- | --------- | ------ |
| 1   | 0000001   | a         |  12000 |
| 2   | 0000001   | c         |  15000 |
| 3   | 0000002   | c         |   2000 |
| 4   | 0000004   | a         |   5000 |
array_table

| item    | array.id1 | array.id2 |
| ------- | --------- | --------- |
| apple   | 0000001   | a         |
|         | 0000002   | b         |
|         | 0000003   | c         |
| pear    | 0000004   | a         |
|         | 0000005   | b         |
|         | 0000006   | c         |

我在想我可以做这样的事情:

SELECT p.*, a.item
FROM prices_table p
LEFT JOIN array_table a
  ON id1 IN UNNEST(array.id1)
  AND id2 IN UNNEST(array.id2) 

但它会导致不正确的连接

expected

| row | id1       | id2       | price  | item  |
| --- | --------- | --------- | ------ | ----- |
| 1   | 0000001   | a         |  12000 | apple |
| 2   | 0000001   | c         |  15000 | null  |
| 3   | 0000002   | c         |   2000 | null  |
| 4   | 0000004   | a         |   5000 | pear  |
actual

| row | id1       | id2       | price  | item  |
| --- | --------- | --------- | ------ | ----- |
| 1   | 0000001   | a         |  12000 | apple |
| 2   | 0000001   | c         |  15000 | apple | < incorrect
| 3   | 0000002   | c         |   2000 | apple | < incorrect
| 4   | 0000004   | a         |   5000 | pear  |

【问题讨论】:

【参考方案1】:

您可以在取消嵌套后使用with offset 对齐数组:

SELECT p.*, a.item
FROM prices_table p LEFT JOIN
     (array_table a CROSS JOIN
      unnest(a.id1) i1 with offset as n1 JOIN
      unnest(a.id2) i2 with offset as n2
      ON n1 = n2
     )
     ON p.id1 = i1 AND p.id2 = i2;

【讨论】:

【参考方案2】:

使用下面的方法

select * from prices_table p
left join (select item, id1, id2, from array_table a, a.array)
using(id1, id2)

如果应用于您问题中的样本数据 - 输出是

【讨论】:

你有机会尝试吗?

以上是关于在 BigQuery 中加入 2 列结构的主要内容,如果未能解决你的问题,请参考以下文章

在 BigQuery 中加入自身

sql [BigQuery - Facebook产品目录]查询para obtenerelcatálogodeproductos de Kichink。 #facebook #bigqu

在BigQuery文件中加载列名称加载python

在 django 中加入 2 个表超过 2 列

查询结果后 BigQuery 导出多个文件

Bigquery - 在一列中加载带有“#N/A”的 CSV