要實現的是去重按順序分組拼接字段,且輸出表中需要拼接多個字段。
1、查了網上大概有四種方法,各有特點:
1、wmsys.wm_concat(column)
2、listagg (column,[,]) within group (order by ) [over (partition by )]
3、sys_connect_by_path(column,《分隔符》)
4、xmlagg (content column,[,] wellformed) within group (order by ) [over (partition by )]
第1種,wmsys使用者用於workspace manager,函式物件可能因版本而不同,oracle官方也不建議使用;不可指定分隔符;支援去重。
第2種,listagg返回結果varchar2型別(最大長度4000),當拼接字串過長會提示「返回結果為字串連線的結果過長」;可指定分隔符;不支援去重。
第3種,此方法未測試。
第4種,返回結果為clob(character large object)型別,最大容量為4gb;可指定分隔符;不支援去重。
2、確定了使用第4種方法,發現實現難點在於分組結果去重,又存在多個字段需要拼接,則先去重只可針對乙個字段,多個欄位就存在問題,採用先產生針對不同字段拼接的臨時表,使用分組字段作為連線更新到主表中。
網上針對xmlagg可使用的去重方法有兩種,一種是使用正規表示式(適用於字串大小比較小的情況,不適用),另一種是先去重再聚合。
create global temporary table d302_2 on commit preserve rows as
select sheng,
xian,
xmmc,
bhyy,
bhsd,
syldxz,
rtrim(xmlagg(xmlparse(content pan_no_tb || '、' wellformed) order by pan_no_tb).getclobval(),
'、') as pan_no_tb
from (select distinct sheng, xian, xmmc, bhyy, bhsd, syldxz, pan_no_tb
from test
where pan_no_tb <> 0)
group by sheng, xian, xmmc, bhyy, bhsd, syldxz;
from 後面括號內實現去重目的
group by 實現分組目的
xmlagg(xmlparse(content pan_no_tb || '、' wellformed) order by pan_no_tb) 實現拼接
getclobval() 獲得clob字串
rtrim 去除最後面的 "、"
注意:xmlagg欄位若為字串,需適應to_char()函式轉換。
3、使用分組字段作為連線更新到主表中(a2,a3,a7,a8,a9,a10分別為主表的sheng, xian, xmmc, bhyy, bhsd, syldxz)
update d302_1
set d302_1.a5 =
(select pan_no_tb
from d302_3
where d302_3.sheng = d302_1.a2
and d302_3.xian = d302_1.a3
and d302_3.xmmc = d302_1.a7
and d302_3.bhyy = d302_1.a8
and d302_3.bhsd = d302_1.a9
and d302_3.syldxz = d302_1.a10)
where exists (select pan_no_tb
from d302_3
where d302_3.sheng = d302_1.a2
and d302_3.xian = d302_1.a3
and d302_3.xmmc = d302_1.a7
and d302_3.bhyy = d302_1.a8
and d302_3.bhsd = d302_1.a9
and d302_3.syldxz = d302_1.a10);
where exists避免不匹配項被更新為空值。 鍊錶去重 25 分
給定乙個帶整數鍵值的鍊錶 l,你需要把其中絕對值重複的鍵值結點刪掉。即對每個鍵值 k,只有第乙個絕對值等於 k 的結點被保留。同時,所有被刪除的結點須被儲存在另乙個鍊錶上。例如給定 l 為 21 15 15 7 15,你需要輸出去重後的鍊錶 21 15 7,還有被刪除的鍊錶 15 15。輸入在第一行...
count去重和distinct去重
有兩種去重方法 1 select count distinct id from a 這個是將所有值都放入到記憶體中,key為列值,通過hash算出有多少個key就是多少行。2 select count 1 from select 1 from a group by id a,這個是通過group b...
JS陣列去重,物件去重
例項1根據indexof去重,indexof的好處就是返回的是首次出現的位置,這樣後面即使出現的值一樣,也只能返回第一次出現的索引,當然這個只適用於簡單的陣列 物件陣列去重 const objarr const obj const newobjarr for let i 0 i objarr.len...