【问题标题】:BigQuery join a nested table onto another tableBigQuery 将嵌套表连接到另一个表
【发布时间】:2020-12-22 02:40:44
【问题描述】:

我正在尝试将包含项目 id 的嵌套数组的一些项目数据表 (table1) 加入另一个包含项目数据 (table2) 的表(此处的顺序很重要强>)

table1
proj_date     num_proj_per_day     proj_size     proj_id(nested)
1/1/2020      4                    150           a123
                                                 b456
                                                 c789
table2
proj_id(not nested)    proj_loc       lots_of_other_proj_fields....
a123                   Los Angeles
b456                   New York
c798                   Los Angeles
d012                   Denver
....                   ....

想要的结果

proj_date     num_proj_per_day     proj_size     proj_id(unnested)   pro_loc    
1/1/2020      4                    150           a123                Los Angeles
1/1/2020      4                    150           b456                New York
1/1/2020      4                    150           c789                Los Angeles

如果我用table1作为from编写sql代码,然后cross join unnest(proj_id),然后left join table2,我已经能够实现这个结果。 问题是我需要在 from 语句中有 table2,然后在 unnested(proj_id) 上加入 table1。订单很重要,因为我必须将这个新数据集(table1)合并到 Looker 中的现有数据集/框架(table2)中

获得正确结果但不适用于我的应用程序的示例

SELECT 
 table1.*,
 table2.proj_loc
FROM table1
CROSS JOIN UNNEST(table1.proj_id) as unnested
LEFT JOIN table2
 ON table2.proj_id = unnested.proj_id

我正在寻找类似下面的内容,但您不能将 unnest 放入 ON 子句 - bigquery 弹出错误“意外关键字 UNNEST”

SELECT 
 table1.*,
 table2.proj_loc
FROM table2
LEFT JOIN table1
 ON UNNEST(table1.proj_id)=table2.proj_id

提前感谢您,如果您需要更多澄清信息,请告诉我

【问题讨论】:

    标签: sql arrays join google-bigquery unnest


    【解决方案1】:

    以下是 BigQuery 标准 SQL

    #standardSQL
    SELECT proj_date, num_proj_per_day, proj_size, t2.*
    FROM `project.dataset.table2` t2
    JOIN `project.dataset.table1` t1 
    ON t2.proj_id IN UNNEST(t1.proj_id)   
    

    您可以使用您问题中的示例数据进行测试,如以下示例所示

    #standardSQL
    WITH `project.dataset.table1` AS (
      SELECT DATE '2020-01-01' proj_date, 4 num_proj_per_day, 150 proj_size, ['a123','b456','c789'] proj_id
    ),`project.dataset.table2` AS (
      SELECT 'a123' proj_id, 'Los Angeles' proj_loc, 1 proj_field1, 2 proj_field2, 3 proj_field3 UNION ALL
      SELECT 'b456', 'New York', 21, 22, 23 UNION ALL
      SELECT 'c789', 'Los Angeles', 31, 32, 33 UNION ALL
      SELECT 'd012', 'Denver', 41, 42, 43 
    )
    SELECT proj_date, num_proj_per_day, proj_size, t2.*
    FROM `project.dataset.table2` t2
    JOIN `project.dataset.table1` t1 
    ON t2.proj_id IN UNNEST(t1.proj_id)   
    

    有输出

    Row proj_date   num_proj_per_day    proj_size   proj_id proj_loc    proj_field1 proj_field2 proj_field3  
    1   2020-01-01  4                   150         a123    Los Angeles 1           2           3    
    2   2020-01-01  4                   150         b456    New York    21          22          23   
    3   2020-01-01  4                   150         c789    Los Angeles 31          32          33  
    

    【讨论】:

    • 哇一整天都在摆弄语法并在 15 分钟内解决。谢谢!将在完整的数据集上使用它,但我认为这会奏效。稍后会回复。谢谢
    • 当然。返回结果并考虑接受:o) - 顺便说一句 - 花了不到 15 分钟 - 大声笑,但是是的 - 从你的角度来看 - 同意 15 分钟,因为你发布了你的问题并且你已经得到了答案 - 这就是SO的力量!!!
    • 是的,我确定你用了不到 15 分钟 - “更改 = 到 IN dummy”:) 哈哈
    猜你喜欢
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 2021-09-02
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2014-06-03
    相关资源
    最近更新 更多