Вот пример с данными, похожими на ваши:
with
-- sample data
main_tbl_name ( column_one, column_two) as (
select 'data1', 'SBANAR SBARTO SCBADP SCCHBA SCHPIT SCTHAB SDPCLV SDPRPN SDPSEC SERIE'
from dual union all
select 'data2', 'SRALEN SRETIN SRUNLI SSAPEL SSATAR SSCMAR SSDECA'
from dual union all
select 'data3', 'DRAP14 E05A E1 ECOMOD ENJO01 ENPC01 ESPHSA ESS' from dual ),
another_tbl_name(column_four) as (
select 'SDPSEC SBANAR SBARTO SCCHBA SDPCLV' from dual union all
select 'DRAP14 E05A ESPHSA ESS' from dual),
-- end of sample data
t1 as (select column_one c1, column_two c2, '"'||replace(column_two, ' ', '", "')||'"' cx
from main_tbl_name),
t2 as (select '"'||replace(column_four, ' ', '", "')||'"' cx
from another_tbl_name)
select c1, c2, listagg(b.cs, ' ') within group (order by b.cs) c3
from (select c1, c2, trim(column_value) cs from t1, xmltable(cx)) a
left join (select trim(column_value) cs from t2, xmltable(cx)) b on a.cs = b.cs
group by c1, c2
... что приводит:
C1 C2 C3
----- -------------------------------------------------------------------- -------------------------------
data1 SBANAR SBARTO SCBADP SCCHBA SCHPIT SCTHAB SDPCLV SDPRPN SDPSEC SERIE SBANAR SBARTO SCCHBA SDPCLV SDPSEC
data2 SRALEN SRETIN SRUNLI SSAPEL SSATAR SSCMAR SSDECA
data3 DRAP14 E05A E1 ECOMOD ENJO01 ENPC01 ESPHSA ESS DRAP14 E05A ESPHSA ESS
демо
Это решение основано на xmltable
, левом соединении и listagg()
. Я предположил, что один пробел является разделителем. Если another_table
содержит данные не в виде списка, вы можете даже упростить этот запрос.
В основном вам нужно разделить список столбцов, а затем соединить. Есть и другие способы сделать это, например, иерархические запросы, функции PLSQL, уже размещенные в SO. Используйте любой метод, который вам подходит.