【问题标题】:Update Statement With DENSE_RANK使用 DENSE_RANK 更新语句
【发布时间】:2019-09-20 12:43:52
【问题描述】:

数据库版本:Oracle 12C

以下是我的数据。

PROCESS_INSTANCE ,ACCRUAL_YEAR, ACCR_PERIOD, ACCRUAL_YEAR1, ACCR_PERIOD1,PROJECT_ID,EMPLID, PERIOD_END_DT, REPORT_DUE_DATE 是我表中的关键字段。

我想在同一张表中将 REGULAR_HOURS、CTS_ACC_OT_HRS 列值更新为 STANDARD_HOURS。

每当员工的 Key 字段组合超过一行(不包括 PROJECT_ID 键)时,我想使用 Rank (process_instance,ACCRUAL_YEAR,ACCR_PERIOD,ACCRUAL_YEAR1,ACCR_PERIOD1,EMPLID,PERIOD_END_DT, REPORT_DUE_DATE)。

PROCESS_INSTANCE    ACCRUAL_YEAR    ACCR_PERIOD ACCRUAL_YEAR1   ACCR_PERIOD1    PROJECT_ID  EMPLID  PERIOD_END_DT   REPORT_DUE_DATE STANDARD_HOURS  REGULAR_HOURS   OVERTIME_HOURS  CTS_ACC_OT_HRS
22196108    2019    8   2019    5   1000237975  787792  03-MAY-19   01-MAY-19   9   0   0   0
22196108    2019    8   2019    5   1000251958  787792  03-MAY-19   01-MAY-19   9   0   0   0
22196108    2019    8   2019    5   1000251958  787792  03-MAY-19   02-MAY-19   9   0   0   0
22196108    2019    8   2019    5   1000251958  787792  03-MAY-19   03-MAY-19   9   0   0   0
22196108    2019    8   2019    5   1000251958  787792  10-MAY-19   06-MAY-19   9   0   0   0
22196108    2019    8   2019    5   1000251958  787792  10-MAY-19   07-MAY-19   9   0   0   0
22196108    2019    8   2019    5   1000251958  787792  10-MAY-19   08-MAY-19   9   0   0   0
22196108    2019    8   2019    5   1000251958  787792  10-MAY-19   09-MAY-19   9   0   0   0
22196108    2019    8   2019    5   1000251958  787792  10-MAY-19   10-MAY-19   9   0   0   0

需要的输出:

在下面的数据中,员工 787792 有两行表示 REPORT_DUE_DATE 01-MAY-19。

所以我想将 REGULAR_HOURS 和 CTS_ACC_OT_HRS 更新为一行的 STANDARD_HOURS,报告截止日期为 19 年 1 月 1 日。

注意:额外的行需要将 STANDARD_HOURS 更新为 0。

PROCESS_INSTANCE    ACCRUAL_YEAR    ACCR_PERIOD ACCRUAL_YEAR1   ACCR_PERIOD1    PROJECT_ID  EMPLID  PERIOD_END_DT   REPORT_DUE_DATE STANDARD_HOURS  REGULAR_HOURS   OVERTIME_HOURS  CTS_ACC_OT_HRS
22196108    2019    8   2019    5   1000237975  787792  03-MAY-19   01-MAY-19   9   9   0   9
22196108    2019    8   2019    5   1000251958  787792  03-MAY-19   01-MAY-19   0   0   0   0
22196108    2019    8   2019    5   1000251958  787792  03-MAY-19   02-MAY-19   9   9   0   9
22196108    2019    8   2019    5   1000251958  787792  03-MAY-19   03-MAY-19   9   9   0   9
22196108    2019    8   2019    5   1000251958  787792  10-MAY-19   06-MAY-19   9   9   0   9
22196108    2019    8   2019    5   1000251958  787792  10-MAY-19   07-MAY-19   9   9   0   9
22196108    2019    8   2019    5   1000251958  787792  10-MAY-19   08-MAY-19   9   9   0   9
22196108    2019    8   2019    5   1000251958  787792  10-MAY-19   09-MAY-19   9   9   0   9
22196108    2019    8   2019    5   1000251958  787792  10-MAY-19   10-MAY-19   9   9   0   9
CREATE TABLE PS_CT_IQN_ACC_STG (PROCESS_INSTANCE DECIMAL(10) NOT NULL,  
   ACCRUAL_YEAR SMALLINT NOT NULL,  
   ACCR_PERIOD SMALLINT NOT NULL,  
   ACCRUAL_YEAR1 SMALLINT NOT NULL,  
   ACCR_PERIOD1 SMALLINT NOT NULL,  
   CTS_ACCRUAL_TYPE VARCHAR2(3)  NULL,  
   CTS_BLNK_TS_FLAG VARCHAR2(1)  NULL,  
   PROJECT_ID VARCHAR2(15)  NOT NULL,  
   ALLOCATION_PERCENT DECIMAL(13, 10)  NULL,  
   PROJ_ACTIVITY_ID VARCHAR2(15)  NULL,  
   EMPLID VARCHAR2(11) NOT NULL,  
   HIRE_DT DATE,  
   ACTION_DT DATE,  
   ACTION VARCHAR2(3)  NULL,  
   CTS_WO_ID VARCHAR2(15)  NULL,  
   CTS_WO_END_DATE DATE,  
   CTS_WO_REG_RATE DECIMAL(15, 2)  NULL,  
   CTS_WO_OT_RATE DECIMAL(15, 2)  NULL,  
   CTS_WO_CURRENCY VARCHAR2(3)  NULL,  
   STANDARD_RATE DECIMAL(15, 2)  NULL,  
   CURRENCY_CD VARCHAR2(3)  NULL,  
   VENDOR_ID VARCHAR2(10)  NULL,  
   CTS_OT_BASIS VARCHAR2(10)  NULL,  
   COUNTRY VARCHAR2(3)  NULL,  
   LOCATION VARCHAR2(10)  NULL,  
   HOLIDAY_SCHEDULE VARCHAR2(6)  NULL,  
   BUSINESS_UNIT VARCHAR2(5)  NULL,  
   PERIOD_END_DT DATE,  
   REPORT_DUE_DATE DATE,  
   CTS_WORKDAY VARCHAR2(3)  NULL,  
   TIME_QUANTITY DECIMAL(14, 2)  NULL,  
   STANDARD_HOURS DECIMAL(14, 2)  NULL,  
   REGULAR_HOURS DECIMAL(15, 3)  NULL,  
   OVERTIME_HOURS DECIMAL(14, 2)  NULL,  
   TIME_SHEET_STATUS VARCHAR2(3)  NULL,  
   POLICY_ID VARCHAR2(50)  NULL,  
   CTS_ACC_REG_HRS DECIMAL(5, 2)  NULL,  
   CTS_ACC_OT_HRS DECIMAL(5, 2)  NULL,  
   CTS_ACCR_BASE_AMT DECIMAL(15, 2)  NULL,  
   CTS_ACCR_OT_AMT DECIMAL(15, 2)  NULL,  
   CTS_ACCR_AMT_TOTAL DECIMAL(15, 2)  NULL);  

CREATE UNIQUE  iNDEX PS_CT_IQN_ACC_STG ON PS_CT_IQN_ACC_STG  
 (PROCESS_INSTANCE,  
   ACCRUAL_YEAR,  
   ACCR_PERIOD,  
   ACCRUAL_YEAR1,  
   ACCR_PERIOD1,  
   PROJECT_ID,  
   EMPLID,  
   PERIOD_END_DT,  
   REPORT_DUE_DATE);  

插入脚本:

Insert into PS_CT_IQN_ACC_STG (PROCESS_INSTANCE,ACCRUAL_YEAR,ACCR_PERIOD,ACCRUAL_YEAR1,ACCR_PERIOD1,CTS_ACCRUAL_TYPE,CTS_BLNK_TS_FLAG,PROJECT_ID,ALLOCATION_PERCENT,PROJ_ACTIVITY_ID,EMPLID,HIRE_DT,ACTION_DT,ACTION,CTS_WO_ID,CTS_WO_END_DATE,CTS_WO_REG_RATE,CTS_WO_OT_RATE,CTS_WO_CURRENCY,STANDARD_RATE,CURRENCY_CD,VENDOR_ID,CTS_OT_BASIS,COUNTRY,LOCATION,HOLIDAY_SCHEDULE,BUSINESS_UNIT,PERIOD_END_DT,REPORT_DUE_DATE,CTS_WORKDAY,TIME_QUANTITY,STANDARD_HOURS,REGULAR_HOURS,OVERTIME_HOURS,TIME_SHEET_STATUS,POLICY_ID,CTS_ACC_REG_HRS,CTS_ACC_OT_HRS,CTS_ACCR_BASE_AMT,CTS_ACCR_OT_AMT,CTS_ACCR_AMT_TOTAL) values (22196108,2019,8,2019,5,'H','Y','1000237975',0,'TBD','787792',to_date('29-APR-2019','DD-MON-YYYY'),to_date('07-MAY-2019','DD-MON-YYYY'),'XFR','12697051',to_date('28-OCT-2019','DD-MON-YYYY'),110,110,' ',65,'USD','0000010018','Weekly','USA','USGADUUA01','HUSA','US410',to_date('03-MAY-2019','DD-MON-YYYY'),to_date('01-MAY-2019','DD-MON-YYYY'),'Y',0,9,0,0,' ','Project',0,0,0,0,0);  
Insert into PS_CT_IQN_ACC_STG (PROCESS_INSTANCE,ACCRUAL_YEAR,ACCR_PERIOD,ACCRUAL_YEAR1,ACCR_PERIOD1,CTS_ACCRUAL_TYPE,CTS_BLNK_TS_FLAG,PROJECT_ID,ALLOCATION_PERCENT,PROJ_ACTIVITY_ID,EMPLID,HIRE_DT,ACTION_DT,ACTION,CTS_WO_ID,CTS_WO_END_DATE,CTS_WO_REG_RATE,CTS_WO_OT_RATE,CTS_WO_CURRENCY,STANDARD_RATE,CURRENCY_CD,VENDOR_ID,CTS_OT_BASIS,COUNTRY,LOCATION,HOLIDAY_SCHEDULE,BUSINESS_UNIT,PERIOD_END_DT,REPORT_DUE_DATE,CTS_WORKDAY,TIME_QUANTITY,STANDARD_HOURS,REGULAR_HOURS,OVERTIME_HOURS,TIME_SHEET_STATUS,POLICY_ID,CTS_ACC_REG_HRS,CTS_ACC_OT_HRS,CTS_ACCR_BASE_AMT,CTS_ACCR_OT_AMT,CTS_ACCR_AMT_TOTAL) values (22196108,2019,8,2019,5,'H','Y','1000251958',0,'TBD','787792',to_date('29-APR-2019','DD-MON-YYYY'),to_date('07-MAY-2019','DD-MON-YYYY'),'XFR','12697051',to_date('28-OCT-2019','DD-MON-YYYY'),110,110,' ',65,'USD','0000010018','Weekly','USA','USGADUUA01','HUSA','US410',to_date('03-MAY-2019','DD-MON-YYYY'),to_date('01-MAY-2019','DD-MON-YYYY'),'Y',0,9,0,0,' ','Project',0,0,0,0,0);  
Insert into PS_CT_IQN_ACC_STG (PROCESS_INSTANCE,ACCRUAL_YEAR,ACCR_PERIOD,ACCRUAL_YEAR1,ACCR_PERIOD1,CTS_ACCRUAL_TYPE,CTS_BLNK_TS_FLAG,PROJECT_ID,ALLOCATION_PERCENT,PROJ_ACTIVITY_ID,EMPLID,HIRE_DT,ACTION_DT,ACTION,CTS_WO_ID,CTS_WO_END_DATE,CTS_WO_REG_RATE,CTS_WO_OT_RATE,CTS_WO_CURRENCY,STANDARD_RATE,CURRENCY_CD,VENDOR_ID,CTS_OT_BASIS,COUNTRY,LOCATION,HOLIDAY_SCHEDULE,BUSINESS_UNIT,PERIOD_END_DT,REPORT_DUE_DATE,CTS_WORKDAY,TIME_QUANTITY,STANDARD_HOURS,REGULAR_HOURS,OVERTIME_HOURS,TIME_SHEET_STATUS,POLICY_ID,CTS_ACC_REG_HRS,CTS_ACC_OT_HRS,CTS_ACCR_BASE_AMT,CTS_ACCR_OT_AMT,CTS_ACCR_AMT_TOTAL) values (22196108,2019,8,2019,5,'H','Y','1000251958',0,'TBD','787792',to_date('29-APR-2019','DD-MON-YYYY'),to_date('07-MAY-2019','DD-MON-YYYY'),'XFR','12697051',to_date('28-OCT-2019','DD-MON-YYYY'),110,110,' ',65,'USD','0000010018','Weekly','USA','USGADUUA01','HUSA','US410',to_date('03-MAY-2019','DD-MON-YYYY'),to_date('02-MAY-2019','DD-MON-YYYY'),'Y',0,9,0,0,' ','Project',0,0,0,0,0);  
Insert into PS_CT_IQN_ACC_STG (PROCESS_INSTANCE,ACCRUAL_YEAR,ACCR_PERIOD,ACCRUAL_YEAR1,ACCR_PERIOD1,CTS_ACCRUAL_TYPE,CTS_BLNK_TS_FLAG,PROJECT_ID,ALLOCATION_PERCENT,PROJ_ACTIVITY_ID,EMPLID,HIRE_DT,ACTION_DT,ACTION,CTS_WO_ID,CTS_WO_END_DATE,CTS_WO_REG_RATE,CTS_WO_OT_RATE,CTS_WO_CURRENCY,STANDARD_RATE,CURRENCY_CD,VENDOR_ID,CTS_OT_BASIS,COUNTRY,LOCATION,HOLIDAY_SCHEDULE,BUSINESS_UNIT,PERIOD_END_DT,REPORT_DUE_DATE,CTS_WORKDAY,TIME_QUANTITY,STANDARD_HOURS,REGULAR_HOURS,OVERTIME_HOURS,TIME_SHEET_STATUS,POLICY_ID,CTS_ACC_REG_HRS,CTS_ACC_OT_HRS,CTS_ACCR_BASE_AMT,CTS_ACCR_OT_AMT,CTS_ACCR_AMT_TOTAL) values (22196108,2019,8,2019,5,'H','Y','1000251958',0,'TBD','787792',to_date('29-APR-2019','DD-MON-YYYY'),to_date('07-MAY-2019','DD-MON-YYYY'),'XFR','12697051',to_date('28-OCT-2019','DD-MON-YYYY'),110,110,' ',65,'USD','0000010018','Weekly','USA','USGADUUA01','HUSA','US410',to_date('03-MAY-2019','DD-MON-YYYY'),to_date('03-MAY-2019','DD-MON-YYYY'),'Y',0,9,0,0,' ','Project',0,0,0,0,0);  
Insert into PS_CT_IQN_ACC_STG (PROCESS_INSTANCE,ACCRUAL_YEAR,ACCR_PERIOD,ACCRUAL_YEAR1,ACCR_PERIOD1,CTS_ACCRUAL_TYPE,CTS_BLNK_TS_FLAG,PROJECT_ID,ALLOCATION_PERCENT,PROJ_ACTIVITY_ID,EMPLID,HIRE_DT,ACTION_DT,ACTION,CTS_WO_ID,CTS_WO_END_DATE,CTS_WO_REG_RATE,CTS_WO_OT_RATE,CTS_WO_CURRENCY,STANDARD_RATE,CURRENCY_CD,VENDOR_ID,CTS_OT_BASIS,COUNTRY,LOCATION,HOLIDAY_SCHEDULE,BUSINESS_UNIT,PERIOD_END_DT,REPORT_DUE_DATE,CTS_WORKDAY,TIME_QUANTITY,STANDARD_HOURS,REGULAR_HOURS,OVERTIME_HOURS,TIME_SHEET_STATUS,POLICY_ID,CTS_ACC_REG_HRS,CTS_ACC_OT_HRS,CTS_ACCR_BASE_AMT,CTS_ACCR_OT_AMT,CTS_ACCR_AMT_TOTAL) values (22196108,2019,8,2019,5,'H','Y','1000251958',0,'TBD','787792',to_date('29-APR-2019','DD-MON-YYYY'),to_date('07-MAY-2019','DD-MON-YYYY'),'XFR','12697051',to_date('28-OCT-2019','DD-MON-YYYY'),110,110,' ',65,'USD','0000010018','Weekly','USA','USGADUUA01','HUSA','US410',to_date('10-MAY-2019','DD-MON-YYYY'),to_date('06-MAY-2019','DD-MON-YYYY'),'Y',0,9,0,0,' ','Project',0,0,0,0,0);  
Insert into PS_CT_IQN_ACC_STG (PROCESS_INSTANCE,ACCRUAL_YEAR,ACCR_PERIOD,ACCRUAL_YEAR1,ACCR_PERIOD1,CTS_ACCRUAL_TYPE,CTS_BLNK_TS_FLAG,PROJECT_ID,ALLOCATION_PERCENT,PROJ_ACTIVITY_ID,EMPLID,HIRE_DT,ACTION_DT,ACTION,CTS_WO_ID,CTS_WO_END_DATE,CTS_WO_REG_RATE,CTS_WO_OT_RATE,CTS_WO_CURRENCY,STANDARD_RATE,CURRENCY_CD,VENDOR_ID,CTS_OT_BASIS,COUNTRY,LOCATION,HOLIDAY_SCHEDULE,BUSINESS_UNIT,PERIOD_END_DT,REPORT_DUE_DATE,CTS_WORKDAY,TIME_QUANTITY,STANDARD_HOURS,REGULAR_HOURS,OVERTIME_HOURS,TIME_SHEET_STATUS,POLICY_ID,CTS_ACC_REG_HRS,CTS_ACC_OT_HRS,CTS_ACCR_BASE_AMT,CTS_ACCR_OT_AMT,CTS_ACCR_AMT_TOTAL) values (22196108,2019,8,2019,5,'H','Y','1000251958',0,'TBD','787792',to_date('29-APR-2019','DD-MON-YYYY'),to_date('07-MAY-2019','DD-MON-YYYY'),'XFR','12697051',to_date('28-OCT-2019','DD-MON-YYYY'),110,110,' ',65,'USD','0000010018','Weekly','USA','USGADUUA01','HUSA','US410',to_date('10-MAY-2019','DD-MON-YYYY'),to_date('07-MAY-2019','DD-MON-YYYY'),'Y',0,9,0,0,' ','Project',0,0,0,0,0);  
Insert into PS_CT_IQN_ACC_STG (PROCESS_INSTANCE,ACCRUAL_YEAR,ACCR_PERIOD,ACCRUAL_YEAR1,ACCR_PERIOD1,CTS_ACCRUAL_TYPE,CTS_BLNK_TS_FLAG,PROJECT_ID,ALLOCATION_PERCENT,PROJ_ACTIVITY_ID,EMPLID,HIRE_DT,ACTION_DT,ACTION,CTS_WO_ID,CTS_WO_END_DATE,CTS_WO_REG_RATE,CTS_WO_OT_RATE,CTS_WO_CURRENCY,STANDARD_RATE,CURRENCY_CD,VENDOR_ID,CTS_OT_BASIS,COUNTRY,LOCATION,HOLIDAY_SCHEDULE,BUSINESS_UNIT,PERIOD_END_DT,REPORT_DUE_DATE,CTS_WORKDAY,TIME_QUANTITY,STANDARD_HOURS,REGULAR_HOURS,OVERTIME_HOURS,TIME_SHEET_STATUS,POLICY_ID,CTS_ACC_REG_HRS,CTS_ACC_OT_HRS,CTS_ACCR_BASE_AMT,CTS_ACCR_OT_AMT,CTS_ACCR_AMT_TOTAL) values (22196108,2019,8,2019,5,'H','Y','1000251958',0,'TBD','787792',to_date('29-APR-2019','DD-MON-YYYY'),to_date('07-MAY-2019','DD-MON-YYYY'),'XFR','12697051',to_date('28-OCT-2019','DD-MON-YYYY'),110,110,' ',65,'USD','0000010018','Weekly','USA','USGADUUA01','HUSA','US410',to_date('10-MAY-2019','DD-MON-YYYY'),to_date('08-MAY-2019','DD-MON-YYYY'),'Y',0,9,0,0,' ','Project',0,0,0,0,0);  
Insert into PS_CT_IQN_ACC_STG (PROCESS_INSTANCE,ACCRUAL_YEAR,ACCR_PERIOD,ACCRUAL_YEAR1,ACCR_PERIOD1,CTS_ACCRUAL_TYPE,CTS_BLNK_TS_FLAG,PROJECT_ID,ALLOCATION_PERCENT,PROJ_ACTIVITY_ID,EMPLID,HIRE_DT,ACTION_DT,ACTION,CTS_WO_ID,CTS_WO_END_DATE,CTS_WO_REG_RATE,CTS_WO_OT_RATE,CTS_WO_CURRENCY,STANDARD_RATE,CURRENCY_CD,VENDOR_ID,CTS_OT_BASIS,COUNTRY,LOCATION,HOLIDAY_SCHEDULE,BUSINESS_UNIT,PERIOD_END_DT,REPORT_DUE_DATE,CTS_WORKDAY,TIME_QUANTITY,STANDARD_HOURS,REGULAR_HOURS,OVERTIME_HOURS,TIME_SHEET_STATUS,POLICY_ID,CTS_ACC_REG_HRS,CTS_ACC_OT_HRS,CTS_ACCR_BASE_AMT,CTS_ACCR_OT_AMT,CTS_ACCR_AMT_TOTAL) values (22196108,2019,8,2019,5,'H','Y','1000251958',0,'TBD','787792',to_date('29-APR-2019','DD-MON-YYYY'),to_date('07-MAY-2019','DD-MON-YYYY'),'XFR','12697051',to_date('28-OCT-2019','DD-MON-YYYY'),110,110,' ',65,'USD','0000010018','Weekly','USA','USGADUUA01','HUSA','US410',to_date('10-MAY-2019','DD-MON-YYYY'),to_date('09-MAY-2019','DD-MON-YYYY'),'Y',0,9,0,0,' ','Project',0,0,0,0,0);  
Insert into PS_CT_IQN_ACC_STG (PROCESS_INSTANCE,ACCRUAL_YEAR,ACCR_PERIOD,ACCRUAL_YEAR1,ACCR_PERIOD1,CTS_ACCRUAL_TYPE,CTS_BLNK_TS_FLAG,PROJECT_ID,ALLOCATION_PERCENT,PROJ_ACTIVITY_ID,EMPLID,HIRE_DT,ACTION_DT,ACTION,CTS_WO_ID,CTS_WO_END_DATE,CTS_WO_REG_RATE,CTS_WO_OT_RATE,CTS_WO_CURRENCY,STANDARD_RATE,CURRENCY_CD,VENDOR_ID,CTS_OT_BASIS,COUNTRY,LOCATION,HOLIDAY_SCHEDULE,BUSINESS_UNIT,PERIOD_END_DT,REPORT_DUE_DATE,CTS_WORKDAY,TIME_QUANTITY,STANDARD_HOURS,REGULAR_HOURS,OVERTIME_HOURS,TIME_SHEET_STATUS,POLICY_ID,CTS_ACC_REG_HRS,CTS_ACC_OT_HRS,CTS_ACCR_BASE_AMT,CTS_ACCR_OT_AMT,CTS_ACCR_AMT_TOTAL) values (22196108,2019,8,2019,5,'H','Y','1000251958',0,'TBD','787792',to_date('29-APR-2019','DD-MON-YYYY'),to_date('07-MAY-2019','DD-MON-YYYY'),'XFR','12697051',to_date('28-OCT-2019','DD-MON-YYYY'),110,110,' ',65,'USD','0000010018','Weekly','USA','USGADUUA01','HUSA','US410',to_date('10-MAY-`2019','DD-MON-YYYY'),to_date('10-MAY-2019','DD-MON-YYYY'),'Y',0,9,0,0,' ','Project',0,0,0,0,0);` 

【问题讨论】:

    标签: sql oracle12c


    【解决方案1】:

    问题不是说如何在共享相同 REPORT_DUE_DATE 的两行之间进行排序。所以在 ORDER BY 子句中使用了 PROJECT_ID。请根据您的排序要求更改此设置。

    merge into PS_CT_IQN_ACC_STG a 
          using (
            select PROCESS_INSTANCE,
                   ACCRUAL_YEAR, 
                   ACCR_PERIOD, 
                   ACCRUAL_YEAR1, 
                   ACCR_PERIOD1,
                   PROJECT_ID,
                   EMPLID, 
                   PERIOD_END_DT, 
                   REPORT_DUE_DATE,
                   case when rn = 1
                        then standard_hours
                        else regular_hours end regular_hours, 
                   case when rn = 1
                        then standard_hours
                        else cts_Acc_ot_hrs end cts_Acc_ot_hrs, 
                   case when rn = 1
                        then standard_hours
                        else 0 end standard_hours,rn
              from (
                    select PROCESS_INSTANCE,
                           ACCRUAL_YEAR, 
                           ACCR_PERIOD, 
                           ACCRUAL_YEAR1, 
                           ACCR_PERIOD1,
                           PROJECT_ID,
                           EMPLID, 
                           PERIOD_END_DT, 
                           REPORT_DUE_DATE,
                           regular_hours, 
                           standard_hours, 
                           cts_Acc_ot_hrs, 
                           row_number() over( partition by PROCESS_INSTANCE,
                                                           ACCRUAL_YEAR, 
                                                           ACCR_PERIOD, 
                                                           ACCRUAL_YEAR1, 
                                                           ACCR_PERIOD1,
                                                           --PROJECT_ID,
                                                           EMPLID, 
                                                           PERIOD_END_DT, 
                                                           report_due_date 
                                                  order by PROJECT_ID) rn
                      from PS_CT_IQN_ACC_STG) 
             ) b
             on (   a.PROCESS_INSTANCE = b.PROCESS_INSTANCE
                and a.ACCRUAL_YEAR = b.ACCRUAL_YEAR
                and a.ACCR_PERIOD = b.ACCR_PERIOD
                and a.ACCRUAL_YEAR1 = b.ACCRUAL_YEAR1
                and a.ACCR_PERIOD1 = b.ACCR_PERIOD1
                and a.PROJECT_ID = b.PROJECT_ID
                and a.EMPLID = b.EMPLID
                and a.PERIOD_END_DT = b.REPORT_DUE_DATE)
           when matched 
           then update set a.REGULAR_HOURS = b.REGULAR_HOURS, 
                           a.CTS_ACC_OT_HRS = b.CTS_ACC_OT_HRS,
                           a.STANDARD_HOURS = b.STANDARD_HOURS;
    

    我在 Oracle Live SQL 中试过这个。

    Using Clause 中的查询运行良好并产生预期的输出。

    PROCESS_INSTANCE    ACCRUAL_YEAR    ACCR_PERIOD    ACCRUAL_YEAR1    ACCR_PERIOD1    PROJECT_ID    EMPLID    PERIOD_END_DT   REPORT_DUE_DATE     REGULAR_HOURS   CTS_ACC_OT_HRS  STANDARD_HOURS  RN
    22196108            2019            8               2019            5               1000237975    787792    03-MAY-19       01-MAY-19           9               9               9               1
    22196108            2019            8               2019            5               1000251958    787792    03-MAY-19       01-MAY-19           0               0               0               2
    22196108            2019            8               2019            5               1000251958    787792    03-MAY-19       02-MAY-19           9               9               9               1
    

    但是合并语句没有按预期工作。第二行全是 9。第一行为 standard_hours 保留 9 而不是将其更新为零。

    PROCESS_INSTANCE    ACCRUAL_YEAR    ACCR_PERIOD ACCRUAL_YEAR1   ACCR_PERIOD1    PROJECT_ID  EMPLID  PERIOD_END_DT   REPORT_DUE_DATE REGULAR_HOURS   CTS_ACC_OT_HRS  STANDARD_HOURS
    22196108            2019            8           2019            5               1000237975  787792  03-MAY-19       01-MAY-19       0               0               9
    22196108            2019            8           2019            5               1000251958  787792  03-MAY-19       01-MAY-19       9               9               9
    22196108            2019            8           2019            5               1000251958  787792  03-MAY-19       02-MAY-19       9               9               9
    

    我在 Oracle 12c 数据库中创建了一个较小版本的表,其中包含 SMALLINT、DECIMAL、DATE 和 VARCHAR2 数据类型列。 MERGE 语句在 Oracle 12c 数据库上运行良好。

    我不确定为什么这在 Oracle Live SQL 中不起作用。但该解决方案适用于 Oracle 12c 数据库上的微型模型表。请检查您的数据库上的解决方案。希望它有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-09
      • 2012-03-28
      • 1970-01-01
      • 2017-04-25
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多