LISTAGG查询" ORA-00937:不是单组组功能"

时间:2014-06-16 22:37:19

标签: sql oracle

我正在尝试使用逗号分隔值列表创建连接。例如:

rule_id | attribute_id
----------------------
1       | a
1       | b
2       | c
2       | d

应该是:

rule_id | attribute_id
----------------------
1       | a,b
2       | c,d

我试图使用LISTAGG这样做。但是,使用下面的代码,我得到ORA-00937: not a single-group group function。我注意到sql-server的FOR PATH语法,但它看起来不适用于我们的配置。这是我的疑问:

SELECT r.rule_id as RULE_ID, 
LISTAGG(a.ATTRIBUTE_ID, ', ') WITHIN GROUP (ORDER BY a.ATTRIBUTE_ID) "ATTR_IDS"
FROM N_RULE r, N_ATTRIBUTE a 
WHERE r.RULE_ID = a.RULE_ID 
ORDER BY r.AUDIENCE, UPPER(r.NAME);

1 个答案:

答案 0 :(得分:8)

我认为要使您的查询有效,您需要添加group by,更改order by。您还应该使用正确的显式连接语法:

SELECT r.rule_id as RULE_ID, 
       LISTAGG(a.ATTRIBUTE_ID, ', ') WITHIN GROUP (ORDER BY a.ATTRIBUTE_ID) as "ATTR_IDS"
FROM N_RULE r JOIN
     N_ATTRIBUTE a 
     ON r.RULE_ID = a.RULE_ID 
GROUP BY r.rule_id
ORDER BY r.rule_id;

或者,您可能希望在结果中包含其他属性:

SELECT r.rule_id, r.AUDIENCE, UPPER(r.NAME) 
       LISTAGG(a.ATTRIBUTE_ID, ', ') WITHIN GROUP (ORDER BY a.ATTRIBUTE_ID) as "ATTR_IDS"
FROM N_RULE r JOIN
     N_ATTRIBUTE a 
     ON r.RULE_ID = a.RULE_ID 
GROUP BY r.rule_id, r.AUDIENCE, UPPER(r.NAME)
ORDER BY r.AUDIENCE, UPPER(r.NAME);