【问题标题】:Update twice nested repeated record更新两次嵌套重复记录
【发布时间】:2019-07-17 15:55:39
【问题描述】:

我正在努力处理这个查询(虚拟版本,其中有更多字段):

UPDATE 
  table1 as base
SET 
  lines = 
    ARRAY(
          SELECT AS STRUCT 
            b.line_id,
            s.purch_id,
            ARRAY(
                  SELECT AS STRUCT
                    wh.warehouse_id,
                    s.is_proposed,
                  FROM table1 as t, UNNEST(lines) as lb, UNNEST(lb.warehouses) as wh
                  INNER JOIN 
                    (SELECT 
                      l.line_id,
                      wh.is_proposed
                     FROM table2, UNNEST(lines) as l, UNNEST(l.warehouses) as wh) as s
                  ON lb.line_id = s.line_id AND wh.warehouse_id = s.warehouse_id)
          FROM table1, UNNEST(lines) as b
          INNER JOIN UNNEST(supply.lines) as s
          ON b.line_id = s.line_id)
FROM 
  table2 as supply
WHERE 
  base.date = supply.date
  AND
  base.sales_id = supply.sales_id

table1 和 table2 具有相同的嵌套:

  • lines:重复记录
  • lines.warehouses : 行内重复记录

(so {... , lines [{... 仓库 [)

另外,table1 是 table2 的子集,它的字段子集,table1 从一开始就将它们设为 NULL(当数据可用时我会刷新信息,因为信息是异步的)。

我首先尝试了这个作为第一步(成功):

UPDATE 
  table1 as base
SET 
  lines = 
    ARRAY(
          SELECT AS STRUCT 
            b.line_id,
            s.purch_id,
            b.warehouses
          FROM table1, UNNEST(lines) as b
          INNER JOIN UNNEST(supply.lines) as s
          ON b.line_id = s.line_id)
FROM 
  table2 as supply
WHERE 
  base.date = supply.date
  AND
  base.sales_id = supply.sales_id

但事实上我也需要更新lines.warehouses,所以我很高兴它可以工作,但这还不够。

完整的查询是有效的,当我在终端中尝试最后一个 ARRAY 部分时,查询速度很快并且输出没有重复。 完整的 UPDATE 仍然没有结束(20 分钟后,我杀了它)。

桌子并没有那么大,两边各 20k(220k 完全展平)。

那么我做错了吗? 有没有更好的办法?

谢谢

【问题讨论】:

  • 我相信您在第 9 行的 ARRAY(...) 语句是导致问题的原因。我很确定这是两个问题之一。 ARRAY() 中的select 可能会执行一次,返回一个大结果,并将该大结果更新到table1 中的每一行。另一种可能性是 ARRAY() 中的select 被执行了很多次(UNNEST(lines) 中的每一行执行一次)。听起来都没有表现。
  • 我想到了类似的东西,因为查询不断添加输出/步骤(如果我正确理解工作细节)。你知道实现这一目标的任何其他模式吗?我想象将两个表展平,然后加入,然后重新嵌套,但似乎不可能使用 UPDATE 模式

标签: google-bigquery


【解决方案1】:

我终于解决了这个问题,它比我想象的要简单得多。 我想我误解了整个查询嵌套是如何工作的。

所以我只是链接了每个可用的数据,从匹配的第一个奇异行到最后一个数组,因为顶层的过滤数据被传播到较低的级别。

UPDATE 
  table1 as base
SET 
  lines = 
    ARRAY(
          SELECT AS STRUCT 
            b.line_id,
            s.purch_id,
            ARRAY(
                  SELECT AS STRUCT
                    wh.warehouse_id,
                    sh.is_proposed,
                  FROM UNNEST(b.warehouses) as wh -- take only upper level data
                  INNER JOIN UNNEST(s.warehouses) as sh -- idem
                  ON wh.warehouse_id = sh.warehouse_id) -- no need to 'redo' the joining on already filtered ones
          FROM UNNEST(base.lines) as b
          INNER JOIN UNNEST(supply.lines) as s
          ON b.line_id = s.line_id)
FROM 
  table2 as supply
WHERE 
  base.date = supply.date
  AND
  base.sales_id = supply.sales_id

不到1分钟查询成功

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 2021-05-21
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 2013-07-18
    • 2021-12-04
    • 2017-01-13
    • 1970-01-01
    相关资源
    最近更新 更多