Oracle 10g:解析 2 列合并重复项

Oracle 10g: parsing 2 columns merging duplicates

我有一个包含 3 列的 table: DATE_ADATE_BISSUE DATE_ADATE_B 可以通过 3 种可能的方式填写: 两者都有一个值,或者只有一个有值,如下所示:

DATE_A    |  DATE_B   | ISSUE
----------+-----------+-----------
20130301  | 20140101  | bla 
20150801  | null      | foo
null      | 20180701  | bar

我需要解析此 table 以填充新的 table,其中 DATE_A 和 DATE_B 均填充单个列 DATE_M。 如果要插入到 DATE_M 中的 DATE_A(或 DATE_B)值已经存在于 DATE_M 中,则源 ISSUE 必须附加现有的 [=18] =] ISSUE。下面的例子说明了原理。

例子

来源

DATE_A    |  DATE_B   | ISSUE
----------+-----------+-----------
20130301  | 20140101  | bla1
20150801  | null      | foo1
null      | 20180701  | bar
20130301  | 20150101  | bla2
20150801  | null      | foo2

目的地

DATE_M    | ISSUE
----------+-----------
20130301  | bla1; bla2
20140101  | bla1
20150801  | foo1; foo2
20150101  | bla2
20180701  | bar

问题

是否可以编写一个查询来执行此操作,还是应该编写一个存储过程?如果单个查询可以,它会是什么?

如果我没理解错的话,您需要 union all 日期值和字符串聚合。 listagg() 是在 11g 中引入的,但您可以使用 wm_concat():

select dte, wm_concat(issue) as issues
from ((select date_a as dte, issue from t where date_a is not null) union all
      (select date_b, issue from t where date_b is not null)
     ) di
group by dte
order by dte;