2011-11-22 115 views
1

当我跑在我的Oracle数据库以下SQL查询:如何编写一个类似于Oracle的GROUP_CONCAT的查询?

SELECT p.pkt_nazwa, 
     u.us_nazwa 
FROM punkty p, 
     kategorie_uslug ku, 
     usluga u 
WHERE ku.pkt_id = p.pktk_1_id 
     AND ku.us_id = u.usk_1_id 
ORDER BY p.pkt_nazwa; 

我得到以下输出:

NAME    | SERVICE 
--------------------|------------------- 
Baita De Mario  | WC 
Baita De Mario  | Kuchnia 
Baita De Mario  | Nocleg 
Bistro-Cafe   | Bar 
Bistro-Cafe   | Dyskoteka 
Bistro-Cafe   | Kuchnia 

我怎么会去得到下面的输出?

NAME    | SERVICES 
--------------------|------------------- 
Baita De Mario  | WC, Kuchnia, Nocleg 
Bistro-Cafe   | Bar, Dyskoteka, Kuchnia 
+0

@JNK原来的问题写很差和OP做的研究很少。但是,我认为这是一个非常好的问题(这是SQL Server和MySQL中的一个常见问题,但从未在Oracle中看到过),所以我编辑它看起来像一个体面的问题。 –

+0

@Adrian - 感谢您付出的努力 – JNK

回答

3
SELECT p.pkt_nazwa AS name, wm_concat(u.us_nazwa) AS services 
FROM punkty p 
JOIN kategorie_uslug ku ON ku.pkt_id = p.pktk_1_id 
JOIN usluga u ON u.usk_1_id = ku.us_id 
GROUP BY p.pkt_nazwa 
ORDER BY p.pkt_nazwa; 

wm_concat()函数存在于大多数的版本。
More about string aggregating in Oracle

+0

非常感谢! – makbol

+0

wm_concat没有记录。 –

0

由于Oracle 11.2这已成为容易使用listagg()

SELECT p.pkt_nazwa AS name, 
     listagg(u.us_nazwa) WITHIN GROUP (ORDER BY u.us_nazwa) AS services 
FROM punkty p 
    JOIN kategorie_uslug ku ON ku.pkt_id = p.pktk_1_id 
    JOIN usluga u ON u.usk_1_id = ku.us_id 
GROUP BY p.pkt_nazwa 
ORDER BY p.pkt_nazwa;