如何在 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