
我看到了一個類似的問題,不解答的不是Oracle
現在有兩個表,表a中
aid 主管領導
1 1,2,3
2 2,4
表b中
bid 姓名
1 李一
2 劉二
3 張三
4 李四
怎么聯合查詢出
序號 主管領導 主管領導姓名
1 1,2,3 李一,劉二,張三
2 2,4 劉二,李四
求救!!!!
uj5u.com熱心網友回復:
with a as(select '1' aid,'1,2,3' 主管領導 from dual union all select '2','2,4' from dual),b as(select '1' bid,'李一' 姓名 from dual union all select '2','劉二' from dual union all
select '3' ,'張三' from dual union all select '4','李四' from dual),
aa as(select aid,regexp_substr(主管領導,'[^,]',1,level) 主管領導
from a
connect by level<=regexp_count(主管領導,',')+1
and prior aid=aid
and prior sys_guid() is not null),
ab as(select aa.aid,aa.主管領導,b.姓名
from aa,b
where aa.主管領導=b.bid)
select aid,listagg(主管領導,',')within group(order by 主管領導) 主管領導,
listagg(姓名,',')within group(order by 主管領導) 姓名
from ab
group by aid
uj5u.com熱心網友回復:
select aid, 主管領導,(select listagg(b.姓名, ',') within group(order by bid)
from b
where instr(',' || a.主管領導 || ',', ',' || b.bid || ',') > 0) 主管領導姓名
from a
uj5u.com熱心網友回復:

學習了,還可以這么寫
uj5u.com熱心網友回復:
性能最好的做法是寫一個函式,根據逗號將id一個一個找出來轉成名稱再拼接回傳拼接順序什么的也不會有問題
uj5u.com熱心網友回復:
未必好,寫成函式沒有背景關系切換成本嗎?
uj5u.com熱心網友回復:
看你資料的版本。11.2以后的版本用2樓的方法最好了
uj5u.com熱心網友回復:
背景關系切換成本相對于較大的表(千條以上)的全表掃描來說,可以忽略不計了可以用一定資料量測驗一下
uj5u.com熱心網友回復:
listagg,二樓的辦法uj5u.com熱心網友回復:
少個11g以前的:with a(aid,aa)
as (
select 1,'1,2,3' from dual
union all select 2,'2,4' from dual
),
b(bid,bb)
as (
select 1,'lee' from dual
union all select 2,'liu' from dual
union all select 3,'zhang' from dual
union all select 4,'si' from dual
)
select aid,aa,to_char(substr(WMSYS.WM_CONCAT(bb),1,1000)) aa_name
from a,b
where instr(','||a.aa||',',','||b.bid||',')>0
group by aid,aa
uj5u.com熱心網友回復:
這種范式設計的方法就是狗屎,用逗號分割,太挫了,最起碼的一范式都不是,小資料量的這么做無視,大資料量的用函式,每條記錄都要這么處理,上千萬條的記錄死定了uj5u.com熱心網友回復:
太給力

uj5u.com熱心網友回復:
用函式該怎么寫啊?我似乎也碰到了類似的問題。uj5u.com熱心網友回復:
2L的就可用,親測有效uj5u.com熱心網友回復:
研究了一下啊上午被后面的‘,’迷惑了寫成這樣是不是清晰了很多?
select aid, 主管領導,
(select listagg(b.姓名, ',') within group(order by bid)
from b
where instr( a.主管領導, b.bid ) > 0) 主管領導姓名
from a
select aid, 主管領導,
(select listagg(b.姓名, ',') within group(order by bid)
from b
where a.主管領導 like ‘%’||b.bid||'%' > 0) 主管領導姓名
from a
uj5u.com熱心網友回復:
合格的二樓uj5u.com熱心網友回復:
如此的話,bid超過兩位數和一位數的混合就會有問題
uj5u.com熱心網友回復:
求支援!!!!!!!我也碰到了uj5u.com熱心網友回復:
很簡單,直接執行以下陳述句即可。WITH
A AS (
SELECT '1' AID,'1,2,3' 主管領導 FROM DUAL UNION ALL
SELECT '2' AID,'2,4' 主管領導 FROM DUAL),
B AS (
SELECT '1' BID,'李一' 姓名 FROM DUAL UNION ALL
SELECT '2' BID,'劉二' 姓名 FROM DUAL UNION ALL
SELECT '3' BID,'張三' 姓名 FROM DUAL UNION ALL
SELECT '4' BID,'李四' 姓名 FROM DUAL
)
SELECT A.AID 序號,A.主管領導,LISTAGG(B.姓名,',') WITHIN GROUP (ORDER BY B.BID) 主管領導姓名 FROM A LEFT JOIN B ON INSTR(','||A.主管領導||',',','||B.BID||',') > 0
GROUP BY A.AID,A.主管領導 ;
uj5u.com熱心網友回復:
不帶分割符號,模糊匹配很容易引起匹配出錯,如 123,23,230,都能匹配上%23%
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/29804.html
標籤:高級技術
