Dla tych, którzy muszą rozwiązać ten problem za pomocą Oracle 9i (lub wcześniejszej), prawdopodobnie będziesz musiał użyć SYS_CONNECT_BY_PATH, ponieważ LISTAGG nie jest dostępny.
Aby odpowiedzieć na OP, następujące zapytanie wyświetli PID z tabeli A i połączy wszystkie kolumny DESC z tabeli 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 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;
Mogą również istnieć przypadki, w których wszystkie klucze i wartości są zawarte w jednej tabeli. Poniższego zapytania można użyć, gdy nie ma tabeli A i istnieje tylko tabela 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;
Wszystkie wartości można dowolnie zmienić. Poszczególne konkatenowane opisy można zmienić w klauzuli PARTITION BY, a listę PID można zmienić w ostatecznej klauzuli ORDER BY.
Alternatywnie: może się zdarzyć, że będziesz chciał połączyć wszystkie wartości z całej tabeli w jeden wiersz.
Kluczową ideą jest tutaj użycie sztucznej wartości dla grupy opisów, które mają być łączone.
W poniższym zapytaniu zostanie użyty stały ciąg „1”, ale każda wartość będzie działać:
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;
Poszczególne połączone opisy można zmienić w klauzuli PARTITION BY.
Kilka innych odpowiedzi na tej stronie również wspomniało o tym niezwykle pomocnym źródle:
https://oracle-base.com/articles/misc/string-aggregation-techniques