【问题标题】:Use of array_agg and array string on inner query在内部查询中使用 array_agg 和数组字符串
【发布时间】:2016-05-17 23:36:24
【问题描述】:

我有以下代码:

DROP SCHEMA IF EXISTS s CASCADE;  
CREATE SCHEMA s;

CREATE TABLE "s"."t1"
(
    "c1" BigSerial PRIMARY KEY,
    "c2" BigInt NOT NULL,
    "c3" BigInt
)
WITH (OIDS=FALSE);

INSERT INTO s.t1 (c2) VALUES (10);
INSERT INTO s.t1 (c2, c3) VALUES (20, 10);
INSERT INTO s.t1 (c2, c3) VALUES (30, 10);

/* 1. */ SELECT t3.c1 FROM s.t1 as t3 JOIN s.t1 as t2 ON t3.c3 = t2.c2;

/* 2. */ SELECT t1.c1, ARRAY_TO_STRING(ARRAY_AGG((t2.c1)), ',') FROM s.t1 LEFT JOIN  s.t1 as t2
ON t2.c3 = t1.c2 GROUP BY t1.c1;

/* 3. */ SELECT c1, c2,
ARRAY_TO_STRING(ARRAY_AGG((SELECT t3.c1 FROM s.t1 as t3 JOIN s.t1 as t2 ON t3.c3 = t2.c2)), ',') 
FROM s.t1 t1
GROUP BY c1;
DROP SCHEMA s CASCADE; 

1 个查询的输出:

 c1 
 ----
 2
 3
(2 rows)

2 查询:

 c1 | array_to_string 
 ----+-----------------
   1 | 2,3
   2 | 
   3 | 
  (3 rows)

3 查询给了我一个错误:

   psql:/tmp/aggregate.sql:24: ERROR:  more than one row returned by a subquery used as an expression

3 查询使用 1 查询作为内部查询。有没有办法让查询 3 与内部查询一起工作为 1 而不是恢复为 2。

3 输出应与 2 相同。

我了解错误消息显示查询 1 用作 3 的子查询时不能返回多于一行。

请原谅我对数据库的了解有限。

答案:

 SELECT c1, c2,
 ARRAY_TO_STRING((SELECT ARRAY_AGG(t2.c1) FROM s.t1 as t2 WHERE t2.c3 = t1.c2), ',') 
 FROM s.t1 t1
 GROUP BY c1;     

【问题讨论】:

    标签: mysql database postgresql aggregate-functions


    【解决方案1】:

    array_agg 函数是一个聚合函数,需要用于列,而不是集合。

    试试这个:

    /* 3. */ SELECT c1, c2,
    ARRAY_TO_STRING((SELECT ARRAY_AGG(t3.c1) FROM s.t1 as t3 JOIN s.t1 as t2 ON t3.c3 = t2.c2), ',')
    FROM s.t1 t1
    GROUP BY c1;
    

    或者使用string_agg函数:

    /* 3. */ SELECT c1, c2,
    (SELECT STRING_AGG(t3.c1::text, ',') FROM s.t1 as t3 JOIN s.t1 as t2 ON t3.c3 = t2.c2)
    FROM s.t1 t1
    GROUP BY c1;
    

    【讨论】:

    • 两者似乎都不起作用: 1. 错误:函数 array_agg(bigint, unknown) 不存在 LINE 10: ARRAY_TO_STRING((SELECT ARRAY_AGG(t3.c1, ',') FROM s. t1 ... ^ 提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。2.psql:/tmp/aggregate.sql:43: 错误:函数 string_agg(bigint, unknown) 不存在第 17 行:(SELECT STRING_AGG(t3.c1, ',') FROM s.t1 as t3 JOIN s.t1... 提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。感谢您的帮助。
    • 对不起,这是我昨晚在手机上写的。我把一些参数放在了错误的位置。来吧,再试一次。
    • c1 | c2 | string_agg ----+----+------------ 2 | 20 | 2,3 1 | 10 | 2,3 3 | 30 | 2,3 我得到了两个查询的输出。
    • 没有。我在找: 1 | 2,3 2 | 3 | 2, 3 应该在第三列中有条目为 2.3
    • 我正在寻找作为查询 2 的输出
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 2014-12-16
    • 1970-01-01
    相关资源
    最近更新 更多