分解一个对象列,连接结果并将它们添加到原始行

Exploding an object column, concatenating the results and adding them to the original rows

我有一个类似这样的雪花 table:

CREATE OR REPLACE VIEW EXAMPLE AS 
SELECT  AS ID_EXAMPLE, 
       PARSE_JSON() AS SOME_JSON
  FROM (VALUES ('a','[1,2]'),
               ('b','[3,4]'));

我想创建一个具有相同结构的派生视图,但有一个额外的列,该列是 JSON 列中值的字符串串联。

此查询新视图的尝试无效:

SELECT E.*,
       EXTRA.VALUE AS EXTRA_COL
 FROM EXAMPLE E
 CROSS JOIN LATERAL 
   (SELECT LISTAGG(VALUE,'/') AS VALUE 
      FROM TABLE(FLATTEN(INPUT => E.SOME_JSON))) EXTRA;             

失败并显示“SQL 编译错误:无法评估不支持的子查询类型”。

这个使用 GROUP BY 的查询确实有效:

SELECT E.*,        
       LISTAGG(EXTRA.VALUE,'/') AS EXTRA_COL
FROM EXAMPLE E
CROSS JOIN LATERAL FLATTEN(INPUT => E.SOME_JSON) EXTRA
GROUP BY E.ID_EXAMPLE, E.SOME_JSON;

问题是我的真实table列数很大,所以GROUP BY写起来和维护起来都会很麻烦。是否有一些不涉及编写完整 GROUP BY 子句的查询公式化方法?

因此将创建移动到 CTE 以证明错误仍然以这种形式发生:

WITH the_view AS (
  SELECT  AS ID_EXAMPLE, 
       PARSE_JSON() AS SOME_JSON
  FROM (VALUES ('a','[1,2]'),
               ('b','[3,4]'))
)
SELECT E.*,
       EXTRA.VALUE AS EXTRA_COL
 FROM the_view E
 CROSS JOIN LATERAL 
   (SELECT LISTAGG(VALUE,'/') AS VALUE 
      FROM TABLE(FLATTEN(INPUT => E.SOME_JSON))) EXTRA;  

的确如此,如果我们将子 select 移动到它自己的 CTE 级别,我们就可以加入 id_column

WITH example AS (
  SELECT  AS ID_EXAMPLE, 
       PARSE_JSON() AS SOME_JSON
  FROM VALUES ('a','[1,2]'),
              ('b','[3,4]')
), sub_process AS (
  SELECT E.ID_EXAMPLE,        
     LISTAGG(EXTRA.VALUE,'/') AS EXTRA_COL
  FROM EXAMPLE E,
  TABLE(FLATTEN(INPUT => E.SOME_JSON)) EXTRA
  GROUP BY E.ID_EXAMPLE
)
SELECT e.*,
       s.EXTRA_COL
 FROM example AS e
 JOIN sub_process s ON E.ID_EXAMPLE = s.ID_EXAMPLE;  

给出:

ID_EXAMPLE  SOME_JSON   EXTRA_COL
a   [    1,    2  ]     1/2
b   [    3,    4  ]     3/4

这似乎解决了问题。