小编Cit*_*ish的帖子

postgres CTE 中的多个更新语句

我遇到了一个包含多个更新语句的 CTE 表达式的奇怪问题。

我可以使用以下 SQL 重现:-

DROP TABLE IF EXISTS foo;
DROP TABLE IF EXISTS baa;
CREATE TABLE foo(id BIGSERIAL, attributes JSONB);
CREATE TABLE baa(id BIGSERIAL, attributes JSON );
INSERT  INTO foo(attributes) SELECT jsonb_build_object('foo', 'baa');

WITH STEP_ONE AS (

    UPDATE foo 
    SET attributes = attributes ||jsonb_build_object('foo2', 'baa2')
    WHERE id = 1
    RETURNING attributes->>'foo' AS foo_att,id

), STEP_TWO AS (
    INSERT INTO baa(attributes)
    SELECT json_build_object('foo', id)
    FROM STEP_ONE
    RETURNING id as baa_id
) 
UPDATE foo
  SET attributes = attributes ||jsonb_build_object('baa', baa_id) …
Run Code Online (Sandbox Code Playgroud)

postgresql common-table-expression

4
推荐指数
1
解决办法
766
查看次数

Postgres:计算子查询中的唯一数组条目

如果我的子查询foo释放行:

ID, USERS 
1   {23129}
2   {23142}
3   {23300,23300}
4   {23129,23300}
Run Code Online (Sandbox Code Playgroud)

如何使用诸如以下的窗口函数来获得查询中的唯一身份用户数:

SELECT ... FROM ( <subquery> ) FOO
Run Code Online (Sandbox Code Playgroud)

我尝试了这个:

array_length(array_agg(array_length(array(SELECT Distinct unnest(users))),1)) over(), 1)
Run Code Online (Sandbox Code Playgroud)

但是会得到数组尺寸不相同的错误

注意:我无法更改子查询来解决此问题。

我可以按以下方式在数组中获取ID:-

string_to_array(string_agg(array_to_string(user_ids, ','), ',') over(),',')
Run Code Online (Sandbox Code Playgroud)

但是它们并没有区别。

sql postgresql select subquery aggregate-functions

2
推荐指数
1
解决办法
818
查看次数