如何在 BigQuery 标准 SQL 中取消嵌套多个数组

Posted

技术标签:

【中文标题】如何在 BigQuery 标准 SQL 中取消嵌套多个数组【英文标题】:How to UNNEST multiple arrays in BigQuery standardSQL 【发布时间】:2019-07-19 07:59:23 【问题描述】:

我正在从包含 JSON 列的 Google Bigquery 表中选择数据。我的表有多个嵌套数组,其中一个包含两个嵌套级别。 这是我的表架构

https://imgur.com/UBPKUMx

我的声明是:

SELECT 
items.*,
pay.*,
credits.creditnoteid,
credits.id,
credits.total
FROM client_account.invoices,
UNNEST(lineitems) items,
UNNEST(items.tracking),
UNNEST(payments) pay,
UNNEST(creditnotes) credits

https://imgur.com/c1YT258

很遗憾,我没有得到任何结果... 你能帮我解除所有数组的嵌套吗?

【问题讨论】:

我不认为这是相关的,但你为什么要取消嵌套items.tracking?您不要在查询的任何部分使用它。 嗨,如果我不取消嵌套 items.tracking,我将无法获取所有项目。* 列。 items.tracking 将保持 JSON 格式。 你能分享一下表架构吗?如果您提供更多可能重现问题的详细信息,这将非常有用。在这里查看如何有效地提问。 ***.com/help/how-to-ask 确定 - imgur.com/UBPKUMx SELECT items.*, tracking.*, pay.*, credits.creditnoteid, credits.id, credits.total FROM client_account.invoices, UNNEST(lineitems) items, UNNEST(items.tracking) tracking, UNNEST(payments) pay, UNNEST(creditnotes) credits 相同 - 没有结果当我排除 UNNEST(creditnotes) 学分并使用此语句时,它可以工作SELECT items.*, tracking.*, pay.* FROM client_account.invoices, UNNEST(lineitems) items, UNNEST(items.tracking) tracking, UNNEST(payments) pay 【参考方案1】:

好的,我对我的一个数据集进行了测试。我认为creditnotes 始终是null。因为在我的情况下,当我取消嵌套始终为空的列时,我没有得到任何结果。您可以使用 LEFT JOIN 修复它

SELECT 
items.*,
tracking.*,
pay.*,
credits.creditnoteid,
credits.id,
credits.total
FROM client_account.invoices
LEFT JOIN UNNEST(lineitems) items
LEFT JOIN UNNEST(items.tracking) tracking
LEFT JOIN UNNEST(payments) pay
LEFT JOIN UNNEST(creditnotes) credits

【讨论】:

谢谢!我想我需要在每一行之后去掉逗号:FROM client_account.invoices, LEFT JOIN UNNEST(lineitems) items, LEFT JOIN UNNEST(items.tracking) tracking, LEFT JOIN UNNEST(payments) pay, 是的,如果你想删除LEFT JOIN UNNEST(creditnotes) credits,你也必须删除前面的逗号。实际上,有时您会在下一行找到带有逗号的查询,因为通过注释掉整行更容易删除部分查询,并且查询仍然有效。 @亚历山德罗。 . .我没有意识到您可以在 BigQuery 中使用 LEFT JOIN 而不使用 ON 子句。我学到了一些东西。 @GordonLinoff - 仅在您加入 UNNEST 数组的情况下才允许使用 - 因此它隐含地加入与数组所在的同一行。所有 JOIN 工作,而不仅仅是 LEFT。在常规情况下,LEFT JOIN 仍然需要遵循 ON 或 USING 子句 @MikhailBerlyant 。 . .这对我来说仍然很奇怪。例如,Postgres 不允许在没有 ON 子句的情况下使用 LEFT JOIN

以上是关于如何在 BigQuery 标准 SQL 中取消嵌套多个数组的主要内容,如果未能解决你的问题,请参考以下文章

在 BigQuery 中展平嵌套和重复的结构(标准 SQL)

使用 BigQuery 取消嵌套 customDimensions

无法使用 google bigquery(标准)取消嵌套某些字段

如何在 BigQuery 中取消嵌套多个数组?

将 JSON 取消嵌套到 SQL 行

如何在存储为字符串的 bigquery 字段中取消嵌套多个数组?