Oracle 9i(またはそれ以前)を使用してこの問題を解決する必要がある場合は、LISTAGGが使用できないため、おそらくSYS_CONNECT_BY_PATHを使用する必要があります。
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;
キーと値がすべて1つのテーブルに含まれている場合もあります。次のクエリは、テーブル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のリストは、最後のORDERBY句で並べ替えることができます。
または、テーブル全体のすべての値を1つの行に連結したい場合があります。
ここでの重要なアイデアは、連結される記述のグループに人為的な値を使用することです。
次のクエリでは、定数文字列「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;
個々の連結された説明は、PARTITIONBY句で並べ替えることができます。
このページの他のいくつかの回答でも、この非常に役立つリファレンスについて言及しています:
https ://oracle-base.com/articles/misc/string-aggregation-techniques