分解一个对象列,连接结果并将它们添加到原始行
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
这似乎解决了问题。
我有一个类似这样的雪花 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
这似乎解决了问题。