我正在尝试将带有复杂查询的子查询从Oracle转换为Postgres。下面是子查询及其给出的错误。我知道' WITHIN GROUP' Postgres也有。我错过了什么?我甚至将Listagg
更改为String_agg
但得到了同样的错误。
Select a, Listagg(b, ', ') WITHIN GROUP (ORDER BY b) "a"
from table;
错误:
错误:语法错误在或附近" WITHIN"第65行:... a,Listagg(b,',')WITHIN GRO ......
**********错误**********
错误:语法错误在或附近" WITHIN" SQL状态:42601字符:5290
答案 0 :(得分:2)
始终在Postgres中使用关键字AS
作为列别名。
无需双引号小写标识符。 (与Oracle不同,Postgres小写标识符除非双引号。)
这也意味着,您最终会得到两个名称为a
的列,因此您必须使用“A”作为第一个或其他内容 - 不确定您的列名是"A"
或a
。
WITHIN GROUP
只能在Postgres 9.4或更高版本中用于这些Ordered-Set Aggregate Functions或这些Hypothetical-Set Aggregate Functions。 string_agg()
目前不在其中。但是你几乎可以使用任何聚合函数作为窗口函数(Oracle术语中的“解析函数”)。
无论哪种方式,您的查询在 RDBMS中似乎都无效。您有一个聚合函数和一个未聚合的列,但没有GROUP BY
子句。要么您希望它是一个窗口函数(Oracle中的分析函数),那么OVER
子句就会丢失。或者您需要为聚合函数添加GROUP BY a
。
我有根据的猜测是你想要的东西:
SELECT a, string_agg(b, ', ' ORDER BY b) AS a2 -- column names?
FROM tbl
GROUP BY a;
Postgres allows to add an ORDER BY
clause to any aggregate function(只对某些人有意义。)
对于像这样的简单查询,您也可以:
SELECT a, string_agg(b, ', ') AS a
FROM (SELECT a, b FROM tbl ORDER BY a,b) t
GROUP BY a;
通常更快。 But read the manual.