2014-06-16 25 views
4

我正嘗試使用逗號分隔值列表創建聯接。例如:LISTAGG查詢「ORA-00937:不是單組功能」

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); 
+0

添加'GROUP BY R.RULE_ID'。爲什麼你要按照沒有出現在你選擇的列中的內容進行排序? –

回答

7

我想爲您的查詢工作,你需要添加一個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); 
+0

因此,它看起來像在某些行中,逗號分隔值是相同的(即「54,54」)任何想法爲什麼? – Kristin

+0

這將意味着'join'正在返回重複項。這個答案可能會給你如何解決它的想法:http://stackoverflow.com/questions/11510870/listagg-in-oracle-to-return-distinct-values。 –