我有一個如下的場景(Oracle的SQL)。
表:Employee
| S.No | 姓名 | 。角色 |
|---|---|---|
| 1 | a | ELE,PLU,OTH |
| 2 | b | MAN,DIR |
| 3 | DIR,FND | |
| DIR,FND | ||
| 4 | d | |
表格。Role_master
| 角色 | 。角色名稱 | 。|||
|---|---|---|---|---|
| ELE | 電工 | |||
| 電工? | ||||
| PLU | 管道工 | 管道工
| MAN | |
| MAN | 經理經理 | DIR | DIR | |
| FND | 創始人 | OTH | 其他 | |
| 其他 |
在上述表格中,我想將兩者連接起來,并期望得到如下輸出。請幫助我找到更好的方法。
| S.No | 姓名 | 。角色 | |
|---|---|---|---|
| 1 | a | 電工,水管工,其他 | |
| 電工,水管工,其他 | |||
| 2 | b | 經理,總監 | |
| 經理,總監 | |||
| 3 | c | 董事,創始人 | 董事,創始人 | 4 | d |
uj5u.com熱心網友回復:
這里有一個選擇:
employee.role分割成行(即獨立的值),以便你可以連接它們到role_master.rolelistagg)SQL>/span> with
2 employee (sno, name, role) as
3 (select 1, 'a'/span>, 'ELE,PLU,OTH' from dual union all
4 select 2, 'b', 'MAN,DIR' from double
5 )。)
6 role_master (role, role_name) as
7 (select 'ELE'/span>, 'Electrician' from dual union all
8 select 'PLU'/span>, 'Plumber' from雙union all
9 select 'OTH'。'Other' from double union all
10 select 'MAN'/span>, 'Manager' from double union all
11 select 'DIR'/span>, 'Director' from dual
12 )
13 --
14 select e.sno,
15 e.name。
16 listagg(m. role_name, ',') within group (order by column_value) role
17 from employee e cross join
18 table(cast(multiset(select level from double
19 connect by level <= regexp_count(e。 role, ',') 1。
20 ) as sys.odcinumberlist))
21 join role_master m on m. role = regexp_substr(e.role, ' [^,] ', 1, column_value)
22 group by e.sno, e.name。
SNO NAME ROLE
---------- ---- ----------------------------------------
1 a 電工、水管工、其他
2 b 經理、主任
SQL>
uj5u.com熱心網友回復:
另一個解決方案可以使用這個邏輯 :
- 首先,生成分割步驟所需的最大行數(required_rows_v)
- 然后,在三個資料源之間進行左鍵連接,如下所示 。
- 然后,使用listagg函式來重新聚合行 。
Withrequired_rows_v (lvl) as (
select level lvl
from dual
connect by level <= ( select max ( regexp_count( e.) Role, ' [^,] ' ) from employee e )
)
select e.SNO,
e.NAME。
listagg(rm. Role_name, ',')within group (order by e.SNo, v.lvl) 角色
from employee e
left join required_rows_v v on v。 lvl <= regexp_count( e.Role, ' [^,] ' )
left join Role_master rm on rm. 角色 = regexp_substr( e.Role, '[^,] '/span>, 1, v.lvl )
group by e.SNO, e.NAME
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/308117.html
標籤:
