對於那些必須使用Oracle 9i(或更早版本)解決此問題的人員,您可能需要使用SYS_CONNECT_BY_PATH,因爲LISTAGG不可用。
要接聽OP,以下查詢將顯示來自表A PID和串聯從表B中的所有DESC列:
SELECT pid, SUBSTR (MAX (SYS_CONNECT_BY_PATH (description, ', ')), 3) all_descriptions
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY pid ORDER BY pid, seq) rnum, pid, description
FROM (
SELECT a.pid, seq, description
FROM table_a a, table_b b
WHERE a.pid = b.pid(+)
)
)
START WITH rnum = 1
CONNECT BY PRIOR rnum = rnum - 1 AND PRIOR pid = pid
GROUP BY pid
ORDER BY pid;
還可以有其中鍵和值都包含在一個實例表。可以在沒有表A並且只有表B存在的情況下使用以下查詢:
SELECT pid, SUBSTR (MAX (SYS_CONNECT_BY_PATH (description, ', ')), 3) all_descriptions
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY pid ORDER BY pid, seq) rnum, pid, description
FROM (
SELECT pid, seq, description
FROM table_b
)
)
START WITH rnum = 1
CONNECT BY PRIOR rnum = rnum - 1 AND PRIOR pid = pid
GROUP BY pid
ORDER BY pid;
所有值都可以根據需要重新排序。單獨的連接描述可以在PARTITION BY子句中重新排序,並且PID的列表可以在最後的ORDER BY子句中重新排序。
或者:有時可能當你想從整個表中的所有值連接成一排。
這裏的關鍵思想是對描述組使用人爲值進行連接。
在下面的查詢,常數串「1」被使用,但任何值將工作:
SELECT SUBSTR (MAX (SYS_CONNECT_BY_PATH (description, ', ')), 3) all_descriptions
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY unique_id ORDER BY pid, seq) rnum, description
FROM (
SELECT '1' unique_id, b.pid, b.seq, b.description
FROM table_b b
)
)
START WITH rnum = 1
CONNECT BY PRIOR rnum = rnum - 1;
單個級聯描述可以在PARTITION BY子句重新排序。
此頁面上的其他幾個答案也提到這個非常有用的參考: https://oracle-base.com/articles/misc/string-aggregation-techniques
見例如:http://halisway.blogspot.com/2006/08/oracle-groupconcat-updated-again.html – Andomar 2011-01-13 23:40:35
請看[該解決方案] (https://stackoverflow.com/a/19348687/2459039)。這對你有用。 – 2017-07-06 10:59:06