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;
키와 값이 모두 하나의 테이블에 포함되어있는 경우도 있습니다. 테이블 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