Я пытаюсь получить несколько составных различных varchars (с именем CODE в запросе) из нескольких строк в нескольких столбцах, используя LISTAGG в oracle 12C, LISTAGG (отличный ...) решаетпроблема на 19c, но я должен работать с 12c.
неожиданный результат
Я получаю вышеуказанный результат, используя этот запрос:
SELECT
T.c1 A,
T.c2 B,
LISTAGG( TI.CODE , ';' ) WITHIN GROUP (ORDER BY TI.CODE) AS COLUMNX1,
LISTAGG( TE.CODE, ' ;') WITHIN GROUP (ORDER BY TE.CODE ) AS COLUMNX2,
LISTAGG(TR.CODE, '; ') WITHIN GROUP (ORDER BY TR.CODE ) AS COLUMNX3
FROM TABLE1 T
INNER join TABLE_I TI on TI.fk_c2 = T.c2
INNER join TABLE_E TE on TE.fk_c2 = T.c2
INNER join TABLE_R TR on TR.fk_c2 = T.c2
WHERE T.d = *parameter*
GROUP BY
T.c1,
T.c2;
Iхотите получить это:
Ожидаемый результат
Строки, отмеченные желтым, не должны быть извлечены.
В каждой строке результата запроса столбцыCOLUMNX1, COLUMNX2, COLUMNX3 имеют одинаковое количество объединенных строк, поэтому у меня проблема с дублированием.
, кроме того, все TABLE_I, TABLE_E и TABLE_R имеют внешний ключ fk_c2, который ссылается на TABLE1.c2
РЕДАКТИРОВАТЬ:
Я сначала добавил предложение с, чтобы получить различные значения, затем я присоединил его к своему оператору выбора
Ожидаемый результат получен с этим запросом
WITH TEMP AS (
SELECT fk_c2, LISTAGG(code, ',') WITHIN GROUP (ORDER BY code) AS X1
FROM (
SELECT DISTINCT *
FROM TABLE_I
GROUP BY fk_c2 ) COLUMNX1
INNER JOIN
(SELECT fk_c2, LISTAGG(code, ',') WITHIN GROUP (ORDER BY code) AS X2
FROM (
SELECT DISTINCT *
FROM TABLE_E)
GROUP BY fk_c2 ) COLUMNX2
ON COLUMNX1.fk_c2 = COLUMNX2.fk_c2
INNER JOIN
(SELECT fk_c2, LISTAGG(code, ',') WITHIN GROUP (ORDER BY code) AS X3
FROM(
SELECT DISTINCT *
FROM TABLE_R)
GROUP BY fk_c2 ) COLUMNX3
ON COLUMNX1.fk_c2 = COLUMNX3.fk_c2
)
SELECT
T.c1 A,
T.c2 B,
tmp.X1,
tmp.X2,
tmp.X3
FROM TABLE1 T
INNER join temp tmp on tmp.fk_c2 = T.c2
WHERE T.d = *parameter*
GROUP BY
T.c1,
T.c2
tmp.X1,
tmp.X2,
tmp.X3;