ITPUB论坛-中国最专业的IT技术社区

 找回密码
 注册
查看: 1019|回复: 10

[PL/SQL] 一个关于Merge 的问题 in Oracle

[复制链接]
论坛徽章:
1
秀才
日期:2017-09-25 15:10:56
发表于 2017-11-23 14:00 | 显示全部楼层 |阅读模式
现在有两个source 表 A,B,一个Target 表 C。
      create table A(
           name varchar2(20),
          age     varchar2(20),
          plant   varchar2(20),
          date_no  date sysdate,
          dept    varchar2(20));
   alter table A add constraint A_pk primary key(name,age);

      create table A(
                    name varchar2(20),
                   age     varchar2(20),
          date_no  date sysdate,
          habit   varchar2(20));
   alter table B add constraint B_pk primary key(name,age);
      create table  C(
          name   varchar2(20),
          age      varchar2(20),
         plant      varchar2(20),
         date_no   date sysdate,
          dept       varchar2(20),
          habit       varchar2(20));
alter table C add constraint C_pk primary key(name,age);
---------------------------------------------------------------------------------------
   问题来了:Merge   into  C  using(  WITH Source_A as
                                                                             (select
                                                                                     name,age,date_no,dept from A where date_no<sysdate
                                                                             )
                                                       Union
                                                     With Source_B as
                                                                            (select
                                                                                      name,age,date_no,habit from B where date_no<sysdate
                                                                              )
                                                        where Source_A.name=Source_B.name
                                                         and    Source_A.age=Source_B.age)
                                                    )
  union对表的扫描次数很多,效率不高,而且这次存放的数据将会高达几千万,请问有什么好的效率高的写法?






论坛徽章:
69
山治
日期:2017-09-11 19:15:33处女座
日期:2015-11-27 12:27:01秀才
日期:2015-11-23 10:17:19秀才
日期:2015-11-23 09:57:36金牛座
日期:2016-04-01 18:05:22秀才
日期:2015-11-11 10:22:49摩羯座
日期:2015-08-20 16:22:52秀才
日期:2015-08-31 13:02:54秀才
日期:2015-12-25 15:31:10巨蟹座
日期:2015-11-04 12:43:04
发表于 2017-11-23 14:57 | 显示全部楼层
语句没帖对吧?你用UNION不用union all是为了去重?去重考虑效率更高的group by 或者distinct

使用道具 举报

回复
认证徽章
论坛徽章:
8
2009新春纪念徽章
日期:2009-01-04 14:52:28祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-03-01 11:07:24ITPUB9周年纪念徽章
日期:2010-10-08 09:32:25ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262013年新春福章
日期:2013-02-25 14:51:24沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:57:31
发表于 2017-11-23 16:27 来自手机 | 显示全部楼层
1、贴计划;

使用道具 举报

回复
认证徽章
论坛徽章:
8
2009新春纪念徽章
日期:2009-01-04 14:52:28祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-03-01 11:07:24ITPUB9周年纪念徽章
日期:2010-10-08 09:32:25ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262013年新春福章
日期:2013-02-25 14:51:24沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:57:31
发表于 2017-11-23 16:28 来自手机 | 显示全部楼层
sqysl 发表于 2017-11-23 16:27
1、贴计划;

1、贴计划;
2、这里干嘛非得用with as?数据量大时这是个麻烦。

使用道具 举报

回复
论坛徽章:
1
秀才
日期:2017-09-25 15:10:56
 楼主| 发表于 2017-11-23 17:03 | 显示全部楼层
sqysl 发表于 2017-11-23 16:28
1、贴计划;
2、这里干嘛非得用with as?数据量大时这是个麻烦。

直接给全部代码吧,太累了,您看看就懂我的意思了。

                    
                                 create or replace
PROCEDURE P_DM6_MAT_STLOC
----------------------------------------------------------------------------
  -- SA:               Bert Ye
  -- SA Doc:           DSFNPROC0157_P_DM6_MAT_STLOC.doc
  -- Job Name:         
  -- Target Table:     HQDM.F_SAP_MAT_ATLOC
  -- Source From       HQSTG.sap_mat_stloc,HQSTG.SAP_CURSTOCK_GRPTERMS;
  -- ETL Method:       Insert/Update
  -- Frequency:        hourly
  -- Parameter:
  --
  
----------------------------------------------------------------------------
  -- Code Tag          Person              Date              Comments
  --                  Demond Zhao        2017/11/20           Original   
----------------------------------------------------------------------------
IS
  V_NEW_REQUEST_8TS  NUMBER(14, 0);
  V_LAST_REQUEST_8TS NUMBER(14, 0);
--
BEGIN
  V_NEW_REQUEST_8TS  := to_number (to_char (SYSDATE (), 'YYYYMMDDHH24MISS'));
  V_LAST_REQUEST_8TS := F_GET_LAST_REQUEST_8TS('P_DM6_MAT_STLOC');
                           
  Merge into HQDM.F_SAP_MAT_STLOC T
       USING (
                select
                        CC.WERKS,
                        CC.LGORT,
                        CC.MATNR,
                        AA.LGPBE,
                        AA.DISKZ,
                        AA.NETTABLE,
                        AA.KPCO,
                        AA.LSTTXNDT,
                        AA.ERSDA,
                        AA.LMINB,
                        AA.LSOBS,
                        AA.LVORM,
                        BB.VWDAT,
                        BB.BASME,
                        BB.HWAER,
                        BB.DISPO,
                        BB.MTART,
                        BB.MATKL,
                        BB.DISMM,
                        BB.GSBER,
                        BB.SPART,
                        BB.MBWBEST,
                        BB.WBWBEST,
                        BB.MKOBEST,
                        BB.LETZTZUG,
                        BB.LETZTABG,
                        BB.LETZTVER,
                        BB.LETZTBEW,
                        BB.EISBE,
                        BB.BKLAS,
                        AA.ETL_8TIMESTAMP
                  From  HQSTG.SAP_MAT_STLOC AA, HQSTG.SAP_CURSTOCK_GRPTERMS BB,
                                                                (Select
                                                                                     WERKS,
                                                                                     LGORT,
                                                                                     MATNR
                                                                                 From HQSTG.SAP_MAT_STLOC A
                                                                                 Where A. ETL_8TIMESTAMP >= V_LAST_REQUEST_8TS
                                                                                 And   A. ETL_8TIMESTAMP < V_NEW_REQUEST_8TS
                                                                 Intersect
                                                                 Select
                                                                     WERKS,
                                                                     LGORT,
                                                                     MATNR
                                                                 From HQSTG.SAP_CURSTOCK_GRPTERMS B
                                                                 Where B. ETL_8TIMESTAMP >= V_LAST_REQUEST_8TS
                                                                 And   B. ETL_8TIMESTAMP < V_NEW_REQUEST_8TS
                                                               )CC
                    WHERE AA.WERKS=BB.WERKS
                    AND   AA.LGORT=BB.LGORT
                    AND   AA.MATNR=BB.MATNR
                    AND   CC.WERKS=BB.WERKS
                    AND   CC.LGORT=BB.LGORT
                    AND   CC.MATNR=CC.MATNR
                    AND   AA.WERKS=CC.WERKS
                    AND   AA.LGORT=CC.LGORT
                    AND   AA.MATNR=CC.MATNR
                      )S
           ON(
                   T. Plant  =  S. WERKS
               AND T. STORAGE_LOC = S. LGORT
               AND T. Material = S. MATNR
                       )
      WHEN MATCHED THEN
          UPDATE SET
                    T.        STORAGE_BIN        =        S. LGPBE,
                    T.        MRP_Indicator        =        S. DISKZ,
                    T.        Nettable_Flag        =        S. NETTABLE,
                    T.        Keeper_Code        =        S. KPCO,
                    T.        Last_trans_date        =        S. LSTTXNDT,
                    T.        CREATED_DATE =        S. ERSDA,
                    T.        MRP_REC_Point        =        S. LMINB,
                    T.        Storage_Special_Proc_Type        =        S. LSOBS,
                    T.        Storage_Mat_deletion_flag        =        S. LVORM,
                    T.        Pointer_admin_data =        S. VWDAT,
                    T.        BASEUOM        =        S. BASME,
                    T.        CURRENCY        =        S. HWAER,
                    T.        MRP_Controller        =        S. DISPO,
                    T.        Material_type        =        S. MTART,
                    T.        Material_Grp =        S. MATKL,
                    T.        MRP_type        =        S. DISMM,
                    T.        Business_Area        =        S. GSBER,
                    T.        Division        =        S. SPART,
                    T.        stock_QTY        =        S. MBWBEST,
                    T.        stock_value        =        S. WBWBEST,
                    T.        consign_stock_qty        =        S. MKOBEST,
                    T.        Last_Receipt_date        =        S. LETZTZUG,
                    T.        Last_goods_issue_date        =        S. LETZTABG,
                    T.        Last_consumption_date        =        S. LETZTVER,
                    T.        Last_goods_movement_date = S. LETZTBEW,
                    T.        Safety_stock        =        S. EISBE,
                    T.        Valuation_calss        =        S. BKLAS,
                    T.        ETL_8TIMESTAMP        =        S. ETL_8TIMESTAMP,
                    T.        TGT_8TIMESTAMP        =        V_NEW_REQUEST_8TS
      WHEN NOT MATCHED THEN
           INSERT
                 (
                  T.        Plant,
                  T.        STORAGE_LOC,       
                  T.        Material,       
                  T.        STORAGE_BIN        ,
                  T.        MRP_Indicator        ,
                  T.        Nettable_Flag        ,
                  T.        Keeper_Code        ,
                  T.        Last_trans_date        ,
                  T.        CREATED_DATE,       
                  T.        MRP_REC_Point,       
                  T.        Storage_Special_Proc_Type        ,
                  T.        Storage_Mat_deletion_flag        ,
                  T.        Pointer_admin_data,
                  T.        BASEUOM        ,
                  T.        CURRENCY        ,
                  T.        MRP_Controller        ,
                  T.        Material_type        ,
                  T.        Material_Grp,       
                  T.        MRP_type,       
                  T.        Business_Area,       
                  T.        Division,       
                  T.        stock_QTY,       
                  T.        stock_value,       
                  T.        consign_stock_qty,       
                  T.        Last_Receipt_date,       
                  T.        Last_goods_issue_date,       
                  T.        Last_consumption_date,       
                  T.        Last_goods_movement_date,       
                  T.        Safety_stock,       
                  T.        Valuation_calss        ,
                  T.        ETL_8TIMESTAMP,       
                  T.        TGT_8TIMESTAMP       
                 )
           VALUES
                 (
                  S.        WERKS,
                  S.        LGORT,
                  S.        MATNR,
                  S.        LGPBE,
                  S.        DISKZ,
                  S.        NETTABLE,
                  S.        KPCO,
                  S.        LSTTXNDT,
                  S.        ERSDA,
                  S.        LMINB,
                  S.        LSOBS,
                  S.        LVORM,
                  S.        VWDAT,
                  S.        BASME,
                  S.        HWAER,
                  S.        DISPO,
                  S.        MTART,
                  S.        MATKL,
                  S.        DISMM,
                  S.        GSBER,
                  S.        SPART,
                  S.        MBWBEST,
                  S.        WBWBEST,
                  S.        MKOBEST,
                  S.        LETZTZUG,
                  S.        LETZTABG,
                  S.        LETZTVER,
                  S.        LETZTBEW,
                  S.        EISBE,
                  S.        BKLAS,
                  S.  ETL_8TIMESTAMP,
                  V_NEW_REQUEST_8TS
                  );
        COMMIT;
        P_BO_UPDATE_LAST_REQUEST_8TS ('P_DM6_MAT_STLOC', V_NEW_REQUEST_8TS);
EXCEPTION
  WHEN NO_DATA_FOUND
  THEN
    NULL;
  WHEN OTHERS
  THEN
    RAISE;
END;

                 

使用道具 举报

回复
论坛徽章:
1
秀才
日期:2017-09-25 15:10:56
 楼主| 发表于 2017-11-23 17:07 | 显示全部楼层
wa47750033 发表于 2017-11-23 17:03
直接给全部代码吧,太累了,您看看就懂我的意思了。

                    

就是要将Source A 的几个栏位和Source B 的几个栏位 合并到另一个Target table中,SA刚刚改了需求取并集且要去重,我一直在写并集,尴尬!

使用道具 举报

回复
论坛徽章:
1
秀才
日期:2017-09-25 15:10:56
 楼主| 发表于 2017-11-23 17:08 | 显示全部楼层
wa47750033 发表于 2017-11-23 17:07
就是要将Source A 的几个栏位和Source B 的几个栏位 合并到另一个Target table中,SA刚刚改了需求取并集 ...

感觉交集,并集不重要啦,就是拉不过去数据到Target 我授权对的。

使用道具 举报

回复
论坛徽章:
1
秀才
日期:2017-09-25 15:10:56
 楼主| 发表于 2017-11-23 17:11 | 显示全部楼层
werks lgort matnr 是Soure 的主键,哎表达能力不行,苦了帮我的人。努力努力!

使用道具 举报

回复
认证徽章
论坛徽章:
8
2009新春纪念徽章
日期:2009-01-04 14:52:28祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-03-01 11:07:24ITPUB9周年纪念徽章
日期:2010-10-08 09:32:25ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262013年新春福章
日期:2013-02-25 14:51:24沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:57:31
发表于 2017-11-23 19:02 来自手机 | 显示全部楼层
那你把源码贴出来了,问题到底是什么呢?

使用道具 举报

回复
论坛徽章:
1
秀才
日期:2017-09-25 15:10:56
 楼主| 发表于 2017-11-24 10:00 | 显示全部楼层
sqysl 发表于 2017-11-23 19:02
那你把源码贴出来了,问题到底是什么呢?

哈哈 我已经解决了,表达有待提高

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表