Получил следующие таблицы:
Таблица T
DATE_A | DATE_B | ERRCODE
----------+-----------+--------
01/MAY/13 | 01/JUN/15 | X
01/DEC/17 | 01/FEB/18 | Y
Таблица U
ERRCODE | ERRDESC
--------+-------------------------------------------
X | Conflicting from : {1} and to Period : {2}
Y | Periods : {1} and {2} overlap
Следующий код:
select period, wm_concat(errcode) as issues
from ((select DATE_A as period, errcode from T where DATE_A is not null) union all
(select DATE_B, errcode from T where DATE_B is not null)
) di
group by period
order by period;
преобразует Table T
следующим образом:
PERIOD | ISSUES
----------+--------
01/MAY/13 | X
01/JUN/15 | X
01/DEC/17 | Y
01/FEB/18 | Y
Я хотел бы преобразовать приведенный выше код так, чтобы:
- заменяет ERRCODE из таблицы
T
на соответствующую ERRDESC
из таблицы U
- заменить
{1}
и {2}
в ERRDESC соответственно DATE_A
и DATE_B
- Вставить результат в
Table V
Итак, я попробовал это:
INSERT INTO v (
period,
issues
)
SELECT
period,
wm_concat(issue) AS issues
FROM
(
SELECT
t.date_a AS period,
replace( (
SELECT
u.errdesc AS issue
FROM
u
WHERE
t.errcode = u.errcode
),'{1}', t.date_a) AS issue
FROM
t
WHERE
t.date_a IS NOT NULL
UNION ALL
SELECT
t.date_b,
replace( (
SELECT
u.errdesc AS issue
FROM
u
WHERE
t.errcode = u.errcode
),'{2}', t.date_b)
FROM
t
WHERE
t.date_b IS NOT NULL
) di
GROUP BY
period;
Но я получаю это (Table V
):
PERIOD | ISSUES
----------+--------
01/MAY/13 | Conflicting from : 01/MAY/13 and to Period : {2}
01/JUN/15 | Conflicting from : {1} and to Period : 01/JUN/15
01/DEC/17 | Periods : 01/DEC/17 and {2} overlap
01/FEB/18 | Periods : {1} and 01/FEB/18 overlap
Вместо результата, который я ищу (Table V
):
PERIOD | ISSUES
----------+--------
01/MAY/13 | Conflicting from : 01/MAY/13 and to Period : 01/JUN/15
01/JUN/15 | Conflicting from : 01/MAY/13 and to Period : 01/JUN/15
01/DEC/17 | Periods : 01/DEC/17 and 01/FEB/18 overlap
01/FEB/18 | Periods : 01/DEC/17 and 01/FEB/18 overlap
Причина в том, что все селекторы до объединения не знают о date_b
, а селекторы после не знают о date_a
.
Вопрос
Как изменить последний код, чтобы получить ожидаемый результат?
Примечание
CREATE TABLE T
(
"DATE_A" DATE,
"DATE_B" DATE,
"ERRCODE" VARCHAR2(2)
) ;
Insert into T (DATE_A,DATE_B,ERRCODE) values (to_date('01/MAY/13','DD/MON/RR'),to_date('01/JUN/15','DD/MON/RR'),'X');
Insert into T (DATE_A,DATE_B,ERRCODE) values (to_date('01/DEC/17','DD/MON/RR'),to_date('01/FEB/18','DD/MON/RR'),'Y');
CREATE TABLE U
(
"ERRCODE" VARCHAR2(2),
"ERRDESC" VARCHAR2(100)
) ;
Insert into U (ERRCODE, ERRDESC) values ('X','Conflicting from : {1} and to Period : {2}');
Insert into U (ERRCODE, ERRDESC) values ('Y','Periods : {1} and {2} overlap');
CREATE TABLE V
(
"PERIOD" DATE,
"ISSUES" VARCHAR2(100)
) ;
commit;