在内部查询

时间:2016-05-17 23:36:24

标签: mysql database postgresql aggregate-functions

我有以下代码:

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相同。

据我所知,当用作3的子查询时,错误消息显示查询1不能返回多行。

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

答案:

 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;     

1 个答案:

答案 0 :(得分: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;