Oracle несколько строк в один ряд - PullRequest
0 голосов
/ 13 апреля 2020

Я хочу объединить несколько строк в одну строку в oracle. Вот что я пытаюсь достичь

таблица дел

case_id Name
1       AAA
2       BBB

Таблица тем

case_id Subject
1       ENG
1       MATH
1       SCI
2       ENG
2       HIS

Таблица SUB_LOOKUP

Abbr    Subject
ENG     English
MATH    Mathematics
SCI     Science
HIS     History

Ожидаемый результат

1   AAA     English, Mathematics, Science
2   BBB     English, History

Я попытался использовать функцию LISTAGG, как показано ниже. Он перечисляет то, чего я хотел бы достичь, но проблема возникает, когда я соединяюсь с таблицей поиска, а затем присоединяюсь к основной таблице.

SELECT c.case_id, c.category_id, LISTAGG(cs.special_interest_cd) WITHIN GROUP 
(ORDER BY cs.special_interest_cd) AS description
FROM CASE_SPECIAL_INTEREST cs, cases c
where c.case_id = cs.case_id
GROUP BY c.case_id;

Попытка объединения двух таблиц, но при получении "ORA-00979: не GROUP BY Выражение «Может кто-нибудь помочь с присоединением к 3 таблицам. Можно ли добиться того же самого без LISTAGG, поскольку я читал, что он бросает eception, когда максимальный символ достигнут для varchar?

1 Ответ

2 голосов
/ 13 апреля 2020

Вам нужно только базовое c объединение между тремя таблицами с последующим агрегированием по case_id и name:

SELECT
    c.case_id,
    c.Name,
    LISTAGG(sl.subject, ',') WITHIN GROUP (ORDER BY sl.subject) AS subject
FROM "case" c
LEFT JOIN subject s
    ON c.case_id = s.case_id
LEFT JOIN sub_lookup sl
    ON s.Subject = sl.Abbr
GROUP BY
    c.case_id,
    c.Name;

screen capture of demo below

Демонстрация

Обратите внимание, что здесь я использую левые объединения, чтобы гарантировать, что если у данного case_id нет совпадений для агрегации, эта запись / значение будет по-прежнему сообщаться в наборе результатов.

...