亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

使用PL/SQL合并重復的數據

系統 1903 0

假設有一張表oldyang_bayern,取其中的10條數據作為參考:

現在需要合并此張表中姓名重復的數據,將符合條件的字段值,合并到重名數據中ID最高的那一條。

要合并的字段分為三種情況:

1. 常規字段(DEPARTMENT/JOBTITLE):取重名數據中ID最高的非空值,例如“施魏因施泰格”的DEPARTMENT字段合并后,應取值“組織部”;

2. 依據數值大小取值的字段(SALARY):取重名數據中的最大值;

3. 非常規字段(CITY/DITRICT/ADDRESS/ADDRESSRANK):這些字段都與地址相關,以ADDRESSRANK最高的那條數據為準(ADDRESSRANK由高到低分別為S|A|B|C|D),然后取此條數據中的CITY/DITRICT/ADDRESS值;如果ADDRESSRANK相同,取ID最高的數據。

依據以上條件,此前的10條數據合并后的結果應如下所示:
plsql2

我所給出的方法:

處理合并的存儲過程 prc_oldyang_bayern

    create or replace procedure prc_oldyang_bayern(pname varchar2)
is
cursor cur is
 select * from oldyang_bayern
  where name=pname order by id desc; --NAME相同的數據按id降序排列

 

--申明記錄表info_table,用于存放NAME相同的數據
 type info_table_type is table of oldyang_bayern%ROWTYPE index by binary_integer;
 info_table info_table_type;

 

 info_dest oldyang_bayern%rowtype;
 nCount number(2):=0; --計數變量
 vi number(2); --在更新地址字段時將會用于放入記錄號

 

begin
 open cur;
  --通過循環計數的方式將重復的記錄放入記錄表
  loop
   nCount:= nCount+1;
   fetch cur into info_table(nCount);
   exit when cur%notfound;
  end loop;
 close cur;

 

 nCount := nCount - 1;

 

 --更新常規字段DEPARTMENT/JOBTITLE
 for i in 1..nCount-1 loop
  if i = 1 then
   info_dest.DEPARTMENT:= nvl(info_table(i).DEPARTMENT, info_table(i+1).DEPARTMENT);
  else
   info_dest.DEPARTMENT:= nvl(info_dest.DEPARTMENT, info_table(i+1).DEPARTMENT);
  end if;
 end loop;

 

 for i in 1..nCount-1 loop
  if i = 1 then
   info_dest.JOBTITLE:= nvl(info_table(i).JOBTITLE, info_table(i+1).JOBTITLE);
  else
   info_dest.JOBTITLE:= nvl(info_dest.JOBTITLE, info_table(i+1).JOBTITLE);
  end if;
 end loop;

 

 --更新SALARY字段
 for i in 1..nCount-1 loop
  if i = 1 then
   info_dest.SALARY:= greatest(nvl(info_table(i).SALARY,-1), nvl(info_table(i+1).SALARY,-1));
  else
   info_dest.SALARY:= greatest(nvl(info_dest.SALARY,-1), nvl(info_table(i+1).SALARY,-1));
  end if;
 end loop;
 info_dest.SALARY:= replace(info_dest.SALARY,-1); --處理當SALARY為空值時的狀況

 

 --更新與ADDRESSRANK相關的字段
 --此處引用了一個自定義函數fun_get_ranknum
 --利用這個函數將地址等級S|A|B|C|D轉換成對應的地址等級序號1|2|3|4|5(函數代碼會在后面列出)
 --接著拼接地址等級序號+記錄號,取拼接后最小值
 --此方法用于處理當ADDRESSRANK相同時,取ID最高的那條ADDRESSRANK相關記錄
 --(注:在游標中記錄已按ID降序排列)
 for i in 1..nCount-1 loop
  if i = 1 then
   info_dest.ADDRESSRANK:= least(fun_get_ranknum(info_table(i).ADDRESSRANK)||i, fun_get_ranknum(info_table(i+1).ADDRESSRANK)||i+1);
  else
   info_dest.ADDRESSRANK:= least(info_dest.ADDRESSRANK,  fun_get_ranknum(info_table(i+1).ADDRESSRANK)||i+1);
  end if;
 end loop;

 

 vi:= regexp_substr(info_dest.ADDRESSRANK, '\d$'); --使用正則表達式取出拼接值中的記錄號
 info_dest.ADDRESSRANK:=info_table(vi).ADDRESSRANK;
 info_dest.CITY:=info_table(vi).CITY;
 info_dest.DISTRICT:=info_table(vi).DISTRICT;
 info_dest.ADDRESS:=info_table(vi).ADDRESS;

 

 --將篩選后的變量值更新到ID最高的記錄當中
 update oldyang_bayern
   set DEPARTMENT=info_dest.DEPARTMENT,
     JOBTITLE=info_dest.JOBTITLE,
     SALARY=info_dest.SALARY,
     CITY=info_dest.CITY,
     DISTRICT=info_dest.DISTRICT,
     ADDRESS=info_dest.ADDRESS,
     ADDRESSRANK=info_dest.ADDRESSRANK
  where id = info_table(1).id;

 

 --刪除重復的記錄
 delete from oldyang_bayern where name=pname and id != info_table(1).id;

 

 commit;
end ;
  

?

存儲過程中所用到的自定義函數 fun_get_ranknum

    create or replace function fun_get_ranknum(prank in varchar2)
return varchar2
is
 Result varchar(2);
 vcTemp varchar(2);
begin
 vcTemp:=prank;

 

 case
  when vcTemp = 'S' then
     vcTemp:= '1';
  when vcTemp = 'A' then
     vcTemp:= '2';
  when vcTemp = 'B' then
     vcTemp:= '3';
  when vcTemp = 'C' then
     vcTemp:= '4';
  when vcTemp = 'D' then
     vcTemp:= '5';
  when vcTemp is null then
     vcTemp:= '9';
 end case;

 

 Result := vcTemp;
 return(Result);

 

 exception
  when others then
   Result := '9';
  return result;
end ;
  

?

利用匿名塊傳遞重復姓名到prc_oldyang_bayern,執行合并過程

    declare
cursor cur is select name from oldyang_bayern group by name having count(*)>1;
rec cur%rowtype;
begin
 open cur;
  loop
   fetch cur into rec;
     exit when cur%notfound;
   prc_oldyang_bayern(rec.name);
  end loop;
 close cur;
end;
  

?轉自: http://www.oldyang.com/2009/06/23/using_plsql_remove_duplicates/

使用PL/SQL合并重復的數據


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 黄色小视频在线免费观看 | 久久亚洲综合 | 国产精品久久久久久久hd | 日日夜夜免费精品视频 | 中文字幕在线视频不卡 | 97视频hd| 久久精彩免费视频 | 在线观看高清国产福利视频 | 在线观看亚洲国产 | 播五月综合| 男人私人影院 | 一线毛片 | 国产精久久一区二区三区 | 欧美亚洲国产精品久久久久 | 天天躁日日躁狠狠躁中文字幕 | 毛茸茸成熟女性老太的女bbww | 老子影院午夜伦不卡不四虎卡 | 久热天堂 | 久久久久国产一级毛片高清版 | 97欧美精品一区二区三区 | 亚洲欧美日韩综合一区久久 | 一级毛片日本特黄97人人 | 成人私人影院在线观看网址 | 四虎精品 | 国产欧美在线观看 | 欧美精品国产一区二区三区 | 欧美成人老熟妇暴潮毛片 | 欧美日韩中文字幕在线观看 | 亚洲天天网综合自拍图片专区 | 日日干夜夜操 | 日本久久一区二区 | 国产欧美亚洲另类第一页 | 亚洲欧美成人综合 | 在线免费观看一级毛片 | 亚洲欧美色综合一区二区在线 | 91在线九色| 久久9热| 色综合久久天天综合观看 | 日本手机在线视频 | 欧美色老太婆 | 亚洲精品免费观看 |