【问题标题】:Oracle MAX() bug with NULLs CBO index fix leads to index limitation带有 NULL 的 CBO 索引修复的 Oracle MAX() 错误导致索引限制
【发布时间】:2011-06-17 10:52:35
【问题描述】:

2011 年 1 月 31 日更新

我认为我正在违反数据库限制。 GROUP BY 表达式
并且所有不显着的聚合函数可能都超过了一个
数据库块。
http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/limits003.htm

原帖:

这是在 Oracle 数据库 10g 企业版版本 10.2.0.1.0 - 产品上。

以下插入不返回真正的 MAX() 值
如果我有两条 matchKey 相同的记录,则一条
具有贡献P NULL 值和另一个具有非NULL 值。
有时,MAX() 返回的值是 NULL 值。

INSERT /*+ APPEND */ INTO meCostingXPrePre(  
   matchKey                    ,  
   contributionP               ,  
   stimulusContributionP       ,  
   contributionC               ,  
   ageMultiplier               ,  
   rateTableIdP                ,  
   rateTableIdC                ,  
   accountNbrP                 ,  
   accountNbrC                 ,  
   commissionExpenseAccount    ,  
   commissionReceivableAccount ,  
   commissionType              ,  
   commission                  ,  
   pmPm                        ,  
   fee                         ,  
   planAgeGroupIdP             ,  
   planAgeGroupIdC             ,  
   rafP                        ,  
   rafC                        ,  
   nbrEmployeesRafP            ,  
   nbrEmployeesRafC            ,  
   contractId                  ,  
   basePlanId                  ,  
   groupOrPolicyNumber         ,  
   planCoverageDescription     ,  
   cobraGopn                   ,  
   cobraPcd                    ,  
   cobraCid                    ,  
   benefitId                   ,  
   insuranceStart              ,  
   insuranceEnd                ,  
   categoryId                  )  
   SELECT   
      matchKey                                                                    as matchKey                    ,  
      MAX(NVL(contributionP               ,0 ))                                   as contributionP               ,  
      MAX(NVL(stimulusContributionP       ,0 ))                                   as stimulusContributionP       ,  
      MAX(NVL(contributionC               ,0 ))                                   as contributionC               ,  
      MAX(NVL(ageMultiplier               ,0 ))                                   as ageMultiplier               ,  
      MAX(NVL(rateTableIdP                ,0 ))                                   as rateTableIdP                ,  
      MAX(NVL(rateTableIdC                ,0 ))                                   as rateTableIdC                ,  
      MAX(NVL(accountNbrP                 ,0 ))                                   as accountNbrP                 ,  
      MAX(NVL(accountNbrC                 ,0 ))                                   as accountNbrC                 ,  
      MAX(NVL(commissionExpenseAccount    ,0 ))                                   as commissionExpenseAccount    ,  
      MAX(NVL(commissionReceivableAccount ,0 ))                                   as commissionReceivableAccount ,  
      MAX(NVL(commissionType              ,0 ))                                   as commissionType              ,  
      MAX(NVL(commission                  ,0 ))                                   as commission                  ,  
      MAX(NVL(pmPm                        ,0 ))                                   as pmPm                        ,  
      MAX(NVL(fee                         ,0 ))                                   as fee                         ,  
      MAX(NVL(planAgeGroupIdP             ,0 ))                                   as planAgeGroupIdP             ,  
      MAX(NVL(planAgeGroupIdC             ,0 ))                                   as planAgeGroupIdC             ,  
      MAX(NVL(rafP                        ,0 ))                                   as rafP                        ,  
      MAX(NVL(rafC                        ,0 ))                                   as rafC                        ,  
      MAX(NVL(nbrEmployeesRafP            ,0 ))                                   as nbrEmployeesRafP            ,  
      MAX(NVL(nbrEmployeesRafC            ,0 ))                                   as nbrEmployeesRafC            ,  
      CASE WHEN MAX(contractId) IS NOT NULL AND  
                MIN(contractId) IS NOT NULL AND  
                MAX(contractId) != MIN(contractId) THEN  
         CASE WHEN MAX(contractId) = 'No Contract No' THEN  
            MIN(contractId)  
         WHEN MIN(contractId) = 'No Contract No' THEN  
            MAX(contractId)  
         ELSE  
            MAX(contractId)  
         END  
      ELSE  
         MAX(contractId)  
      END                                                                         as contractId                  ,  
      MAX(NVL(basePlanId                  ,0 ))                                   as basePlanId                  ,  
      CASE WHEN MAX(groupOrPolicyNumber) IS NOT NULL AND  
                MIN(groupOrPolicyNumber) IS NOT NULL AND  
                MAX(groupOrPolicyNumber) != MIN(groupOrPolicyNumber) THEN  
         CASE WHEN MAX(groupOrPolicyNumber) = 'No Contract No' THEN  
            MIN(groupOrPolicyNumber)  
         WHEN MIN(groupOrPolicyNumber) = 'No Contract No' THEN  
            MAX(groupOrPolicyNumber)  
         ELSE  
            MAX(groupOrPolicyNumber)  
         END  
      ELSE  
         MAX(groupOrPolicyNumber)  
      END                                                                         as groupOrPolicyNumber         ,  
      CASE WHEN MAX(planCoverageDescription) IS NOT NULL AND  
                MIN(planCoverageDescription) IS NOT NULL AND  
                MAX(planCoverageDescription) != MIN(planCoverageDescription) THEN  
         CASE WHEN MAX(planCoverageDescription) = 'No Contract No' THEN  
            MIN(planCoverageDescription)  
         WHEN MIN(planCoverageDescription) = 'No Contract No' THEN  
            MAX(planCoverageDescription)  
         ELSE  
            MAX(planCoverageDescription)  
         END  
      ELSE  
         MAX(planCoverageDescription)  
      END                                                                         as planCoverageDescription     ,  
      CASE WHEN MAX(cobraGopn) IS NOT NULL AND  
                MIN(cobraGopn) IS NOT NULL AND  
                MAX(cobraGopn) != MIN(cobraGopn) THEN  
         CASE WHEN MAX(cobraGopn) = 'No Contract No' THEN  
            MIN(cobraGopn)  
         WHEN MIN(cobraGopn) = 'No Contract No' THEN  
            MAX(cobraGopn)  
         ELSE  
            MAX(cobraGopn)  
         END  
      ELSE  
         MAX(cobraGopn)  
      END                                                                         as cobraGopn                   ,  
      CASE WHEN MAX(cobraPcd) IS NOT NULL AND  
                MIN(cobraPcd) IS NOT NULL AND  
                MAX(cobraPcd) != MIN(cobraPcd) THEN  
         CASE WHEN MAX(cobraPcd) = 'No Contract No' THEN  
            MIN(cobraPcd)  
         WHEN MIN(cobraPcd) = 'No Contract No' THEN  
            MAX(cobraPcd)  
         ELSE  
            MAX(cobraPcd)  
         END  
      ELSE  
         MAX(cobraPcd)  
      END                                                                         as cobraPcd                    ,  
      CASE WHEN MAX(cobraCid) IS NOT NULL AND  
                MIN(cobraCid) IS NOT NULL AND  
                MAX(cobraCid) != MIN(cobraCid) THEN  
         CASE WHEN MAX(cobraCid) = 'No Contract No' THEN  
            MIN(cobraCid)  
         WHEN MIN(cobraCid) = 'No Contract No' THEN  
            MAX(cobraCid)  
         ELSE  
            MAX(cobraCid)  
         END  
      ELSE  
         MAX(cobraCid)  
      END                                                                         as cobraCid                    ,  
      MAX(benefitId                           )                                   as benefitId                   ,  
      NULL                                                                        as insuranceStart              ,  
      NULL                                                                        as insuranceEnd                ,  
      NULL                                                                        as categoryId                    
   FROM meCostingXPrePrePre  
   GROUP BY matchKey;  

如果我按如下方式构建索引并给出 CBO 提示

CREATE INDEX C$MECOSTINGXPREPREPRE$MULTI0 ON MECOSTINGXPREPREPRE
(MATCHKEY, CONTRIBUTIONP, STIMULUSCONTRIBUTIONP, CONTRIBUTIONC, AGEMULTIPLIER, 
RATETABLEIDP, RATETABLEIDC, ACCOUNTNBRP, ACCOUNTNBRC, COMMISSIONEXPENSEACCOUNT, 
COMMISSIONRECEIVABLEACCOUNT, COMMISSIONTYPE, COMMISSION, PMPM, FEE, 
PLANAGEGROUPIDP, PLANAGEGROUPIDC, RAFP, RAFC, 
NBREMPLOYEESRAFP, NBREMPLOYEESRAFC, CONTRACTID, BASEPLANID, GROUPORPOLICYNUMBER, 
PLANCOVERAGEDESCRIPTION, COBRAGOPN, COBRAPCD, COBRACID, BENEFITID)
NOLOGGING
TABLESPACE INDX
NOPARALLEL;

INSERT /*+ APPEND */ INTO meCostingXPrePre(
   ...)
   SELECT /*+ INDEX(meCostingXPrePrePre c$mecostingxpreprepre$multi0) */
      ...
   FROM meCostingXPrePrePre
   GROUP BY matchKey;

这使 MAX() 行为正确。

我需要添加 15 个额外的列并更改索引

小问题

CREATE INDEX C$MECOSTINGXPREPREPRE$MULTI0 ON MECOSTINGXPREPREPRE
(MATCHKEY, CONTRIBUTIONP, STIMULUSCONTRIBUTIONP, CONTRIBUTIONC, AGEMULTIPLIER, 
RATETABLEIDP, RATETABLEIDC, ACCOUNTNBRP, ACCOUNTNBRC, COMMISSIONEXPENSEACCOUNT, 
COMMISSIONRECEIVABLEACCOUNT, COMMISSIONTYPE, COMMISSION, PMPM, FEE, 
PLANAGEGROUPIDP, PLANAGEGROUPIDC, ADDRESSONEP, ADDRESSONEC, ADDRESSTWOP, 
ADDRESSTWOC, CITYP, CITYC, STATEP, STATEC, ZIPFULLP, ZIPFULLC, RAFP, RAFC, 
NBREMPLOYEESRAFP, NBREMPLOYEESRAFC, CONTRACTID, BASEPLANID, GROUPORPOLICYNUMBER, 
PLANCOVERAGEDESCRIPTION, COBRAGOPN, COBRAPCD, COBRACID, BENEFITID)
NOLOGGING
TABLESPACE INDX
NOPARALLEL;

给予
ORA-01793: 最大索引列数为 32

第一个 MAX() 不适用于大型列集,第二个是索引+CBO 补丁
导致索引限制。

有什么建议吗?

【问题讨论】:

  • “我需要添加 15 个额外的列”——这些词几乎不应该......不......永远不要说。如果您向已在使用的表中添加 15 列,则您的设计存在问题。如果你有 15 列,你应该考虑看看你可以规范化的地方。
  • MAX(NVL(cobraPcd,'')) 应该做什么?在 Oracle 中,'' 与 NULL 相同,因此 NVL(cobraPcd,'') 与 cobraPcd 相同。无论如何,MAX 处理 NULL 值。
  • Metalink 是否列出了这个错误?你能想出一个简单(意思是没有那么多列)的测试用例来重现它吗?
  • 所有 MAX(NVL(_,'')) 类型的行都是我尝试认为 Oracle MAX() 错误将得到解决的东西。出于所有意图和目的,'' == NULL。我现在已经进行了更改,NVL(,'') 不应该包含在上面。
  • 存储过程上下文中的规范化导致连接完全失控。我同意源表和目标表的规范化,但是,规范化并不总是适用于每个上下文的完美解决方案。

标签: sql oracle oracle10g indexing cbo


【解决方案1】:

如果您得到不正确的结果,那显然是 Oracle 错误。您是否向 Oracle Support 记录了支持请求和/或确定了您遇到的错误(我猜这就是解决方法的来源)?

如果您使用的是 10.2.0.1,您是否尝试过应用最新的补丁集(很可能是 10.2.0.4)?在初始 10.2 版本和终端 10.2 版本之间有许多错误修复。如果这是 Oracle 已修复的错误,则可能还有一次性补丁,尽管该补丁可能需要安装最新的补丁集。

【讨论】:

  • 在完美世界中听起来不错。然而甲骨文的技术支持不是很及时,论坛上除了升级或补丁之外没有人说太多。
  • @Dragos - 你没有应用最新的补丁集有什么原因吗?想要坚持使用旧版本的人通常会这样做,因为他们认为它们更稳定。但它们更稳定,因为已经发布了许多修复各种错误的补丁集。运行未打补丁的旧版本对我来说似乎很奇怪。应用补丁集还将排除许多错误并使故障排除更容易。
  • @Justin - 我会下载并添加补丁集。
  • 我认为您没有得到太多回应,因为大多数人从未见过这样的查询。 MAX 内部的 NVL 对我来说没有多大意义。
  • JOTN,请参阅我在父问题后的第一条评论。
【解决方案2】:

您是否尝试过像这样编写查询的 SELECT 部分。它应该返回相同的结果。

它分两步工作:首先计算所需的最小值和最大值,然后进行一些 NULL 值替换。 (您的 CASE 语句似乎过于复杂,因为您没有考虑到空字符串和 NULL 在 Oracle 中是相同的。)

我很想知道内部 SELECT 是否已经有错误的最大结果。

SELECT   
  matchKey                                                               as matchKey                    ,  
  NVL(contributionP               ,0 )                                   as contributionP               ,  
  NVL(stimulusContributionP       ,0 )                                   as stimulusContributionP       ,  
  NVL(contributionC               ,0 )                                   as contributionC               ,  
  NVL(ageMultiplier               ,0 )                                   as ageMultiplier               ,  
  NVL(rateTableIdP                ,0 )                                   as rateTableIdP                ,  
  NVL(rateTableIdC                ,0 )                                   as rateTableIdC                ,  
  NVL(accountNbrP                 ,0 )                                   as accountNbrP                 ,  
  NVL(accountNbrC                 ,0 )                                   as accountNbrC                 ,  
  NVL(commissionExpenseAccount    ,0 )                                   as commissionExpenseAccount    ,  
  NVL(commissionReceivableAccount ,0 )                                   as commissionReceivableAccount ,  
  NVL(commissionType              ,0 )                                   as commissionType              ,  
  NVL(commission                  ,0 )                                   as commission                  ,  
  NVL(pmPm                        ,0 )                                   as pmPm                        ,  
  NVL(fee                         ,0 )                                   as fee                         ,  
  NVL(planAgeGroupIdP             ,0 )                                   as planAgeGroupIdP             ,  
  NVL(planAgeGroupIdC             ,0 )                                   as planAgeGroupIdC             ,  
  NVL(rafP                        ,0 )                                   as rafP                        ,  
  NVL(rafC                        ,0 )                                   as rafC                        ,  
  NVL(nbrEmployeesRafP            ,0 )                                   as nbrEmployeesRafP            ,  
  NVL(nbrEmployeesRafC            ,0 )                                   as nbrEmployeesRafC            ,  
  CASE
    WHEN maxContractId = 'No Contract No' THEN minContractId
    ELSE maxContractId
  END                                                                    as contractId                  ,
  NVL(basePlanId                  ,0 )                                   as basePlanId                  ,  
  CASE
    WHEN maxGroupOrPolicyNumber = 'No Contract No' THEN minGroupOrPolicyNumber
    ELSE maxGroupOrPolicyNumber
  END                                                                    as groupOrPolicyNumber         ,
  CASE
    WHEN maxPlanCoverageDescription = 'No Contract No' THEN minPlanCoverageDescription
    ELSE maxPlanCoverageDescription
  END                                                                    as planCoverageDescription     ,
  CASE
    WHEN maxCobraGopn = 'No Contract No' THEN minCobraGopn
    ELSE maxCobraGopn
  END                                                                    as cobraGopn                   ,
  CASE
    WHEN maxCobraPcd = 'No Contract No' THEN minCobraPcd
    ELSE maxCobraPcd
  END                                                                    as cobraPcd                    ,
  CASE
    WHEN maxCobraCid = 'No Contract No' THEN minCobraCid
    ELSE maxCobraCid
  END                                                                    as cobraCid                    ,
  benefitId                                                              as benefitId                   ,  
  NULL                                                                   as insuranceStart              ,  
  NULL                                                                   as insuranceEnd                ,  
  NULL                                                                   as categoryId                    
FROM (   
  SELECT
        matchKey                                                            as matchKey                    ,  
        MAX(contributionP               )                                   as contributionP               ,  
        MAX(stimulusContributionP       )                                   as stimulusContributionP       ,  
        MAX(contributionC               )                                   as contributionC               ,  
        MAX(ageMultiplier               )                                   as ageMultiplier               ,  
        MAX(rateTableIdP                )                                   as rateTableIdP                ,  
        MAX(rateTableIdC                )                                   as rateTableIdC                ,  
        MAX(accountNbrP                 )                                   as accountNbrP                 ,  
        MAX(accountNbrC                 )                                   as accountNbrC                 ,  
        MAX(commissionExpenseAccount    )                                   as commissionExpenseAccount    ,  
        MAX(commissionReceivableAccount )                                   as commissionReceivableAccount ,  
        MAX(commissionType              )                                   as commissionType              ,  
        MAX(commission                  )                                   as commission                  ,  
        MAX(pmPm                        )                                   as pmPm                        ,  
        MAX(fee                         )                                   as fee                         ,  
        MAX(planAgeGroupIdP             )                                   as planAgeGroupIdP             ,  
        MAX(planAgeGroupIdC             )                                   as planAgeGroupIdC             ,  
        MAX(rafP                        )                                   as rafP                        ,  
        MAX(rafC                        )                                   as rafC                        ,  
        MAX(nbrEmployeesRafP            )                                   as nbrEmployeesRafP            ,  
        MAX(nbrEmployeesRafC            )                                   as nbrEmployeesRafC            ,  
        MIN(contractId                  )                                   as minContractId               ,  
        MAX(contractId                  )                                   as maxContractId               ,  
        MAX(basePlanId                  )                                   as basePlanId                  ,  
        MIN(groupOrPolicyNumber         )                                   as minGroupOrPolicyNumber      ,  
        MAX(groupOrPolicyNumber         )                                   as maxGroupOrPolicyNumber      ,  
        MIN(planCoverageDescription     )                                   as minPlanCoverageDescription  ,  
        MAX(planCoverageDescription     )                                   as maxPlanCoverageDescription  ,  
        MIN(cobraGopn                   )                                   as minCobraGopn                ,  
        MAX(cobraGopn                   )                                   as maxCobraGopn                ,  
        MIN(cobraPcd                    )                                   as mincobraPcd                 ,  
        MAX(cobraPcd                    )                                   as maxcobraPcd                 ,  
        MIN(cobraCid                    )                                   as minCobraCid                 ,  
        MAX(cobraCid                    )                                   as maxCobraCid                 ,  
        MAX(benefitId                   )                                   as benefitId                   
     FROM meCostingXPrePrePre  
     GROUP BY matchKey
);

【讨论】:

【解决方案3】:

好的,把工作分成两半就能得到我需要的东西:

INSERT /*+ APPEND */ INTO meCostingXPrePreFirstHalf(  
   matchKey                    ,  
   contributionP               ,  
   stimulusContributionP       ,  
   contributionC               ,  
   ageMultiplier               ,  
   rateTableIdP                ,  
   rateTableIdC                ,  
   accountNbrP                 ,  
   accountNbrC                 ,  
   commissionExpenseAccount    ,  
   commissionReceivableAccount ,  
   commissionType              ,  
   commission                  ,  
   pmPm                        ,  
   fee                         ,  
   planAgeGroupIdP             ,  
   planAgeGroupIdC             )  
   SELECT   
      matchKey                                  as matchKey                    ,  
      MAX(NVL(contributionP               ,0 )) as contributionP               ,  
      MAX(NVL(stimulusContributionP       ,0 )) as stimulusContributionP       ,  
      MAX(NVL(contributionC               ,0 )) as contributionC               ,  
      MAX(NVL(ageMultiplier               ,0 )) as ageMultiplier               ,  
      MAX(NVL(rateTableIdP                ,0 )) as rateTableIdP                ,  
      MAX(NVL(rateTableIdC                ,0 )) as rateTableIdC                ,  
      MAX(NVL(accountNbrP                 ,0 )) as accountNbrP                 ,  
      MAX(NVL(accountNbrC                 ,0 )) as accountNbrC                 ,  
      MAX(NVL(commissionExpenseAccount    ,0 )) as commissionExpenseAccount    ,  
      MAX(NVL(commissionReceivableAccount ,0 )) as commissionReceivableAccount ,  
      MAX(NVL(commissionType              ,0 )) as commissionType              ,  
      MAX(NVL(commission                  ,0 )) as commission                  ,  
      MAX(NVL(pmPm                        ,0 )) as pmPm                        ,  
      MAX(NVL(fee                         ,0 )) as fee                         ,  
      MAX(NVL(planAgeGroupIdP             ,0 )) as planAgeGroupIdP             ,  
      MAX(NVL(planAgeGroupIdC             ,0 )) as planAgeGroupIdC                
   FROM meCostingXPrePrePre  
   GROUP BY matchKey;  
/* No commit yet. */

INSERT /*+ APPEND */ INTO meCostingXPrePreOtherHalf(  
   matchKey                    ,  
   rafP                        ,  
   rafC                        ,  
   nbrEmployeesRafP            ,  
   nbrEmployeesRafC            ,  
   contractId                  ,  
   basePlanId                  ,  
   groupOrPolicyNumber         ,  
   planCoverageDescription     ,  
   cobraGopn                   ,  
   cobraPcd                    ,  
   cobraCid                    ,  
   benefitId                   ,  
   insuranceStart              ,  
   insuranceEnd                ,  
   categoryId                  )  
   SELECT  
      matchKey                                                                    as matchKey                    ,  
      MAX(NVL(rafP                        ,0 ))                                   as rafP                        ,  
      MAX(NVL(rafC                        ,0 ))                                   as rafC                        ,  
      MAX(NVL(nbrEmployeesRafP            ,0 ))                                   as nbrEmployeesRafP            ,  
      MAX(NVL(nbrEmployeesRafC            ,0 ))                                   as nbrEmployeesRafC            ,  
      CASE WHEN MAX(contractId) IS NOT NULL AND  
                MIN(contractId) IS NOT NULL AND  
                MAX(contractId) != MIN(contractId) THEN  
         CASE WHEN MAX(contractId) = 'No Contract No' THEN  
            MIN(contractId)  
         WHEN MIN(contractId) = 'No Contract No' THEN  
            MAX(contractId)  
         ELSE  
            MAX(contractId)  
         END  
      ELSE  
         MAX(contractId)  
      END                                                                         as contractId                  ,  
      MAX(NVL(basePlanId                  ,0 ))                                   as basePlanId                  ,  
      CASE WHEN MAX(groupOrPolicyNumber) IS NOT NULL AND  
                MIN(groupOrPolicyNumber) IS NOT NULL AND  
                MAX(groupOrPolicyNumber) != MIN(groupOrPolicyNumber) THEN  
         CASE WHEN MAX(groupOrPolicyNumber) = 'No Contract No' THEN  
            MIN(groupOrPolicyNumber)  
         WHEN MIN(groupOrPolicyNumber) = 'No Contract No' THEN  
            MAX(groupOrPolicyNumber)  
         ELSE  
            MAX(groupOrPolicyNumber)  
         END  
      ELSE  
         MAX(groupOrPolicyNumber)  
      END                                                                         as groupOrPolicyNumber         ,  
      CASE WHEN MAX(planCoverageDescription) IS NOT NULL AND  
                MIN(planCoverageDescription) IS NOT NULL AND  
                MAX(planCoverageDescription) != MIN(planCoverageDescription) THEN  
         CASE WHEN MAX(planCoverageDescription) = 'No Contract No' THEN  
            MIN(planCoverageDescription)  
         WHEN MIN(planCoverageDescription) = 'No Contract No' THEN  
            MAX(planCoverageDescription)  
         ELSE  
            MAX(planCoverageDescription)  
         END  
      ELSE  
         MAX(planCoverageDescription)  
      END                                                                         as planCoverageDescription     ,  
      CASE WHEN MAX(cobraGopn) IS NOT NULL AND  
                MIN(cobraGopn) IS NOT NULL AND  
                MAX(cobraGopn) != MIN(cobraGopn) THEN  
         CASE WHEN MAX(cobraGopn) = 'No Contract No' THEN  
            MIN(cobraGopn)  
         WHEN MIN(cobraGopn) = 'No Contract No' THEN  
            MAX(cobraGopn)  
         ELSE  
            MAX(cobraGopn)  
         END  
      ELSE  
         MAX(cobraGopn)  
      END                                                                         as cobraGopn                   ,  
      CASE WHEN MAX(cobraPcd) IS NOT NULL AND  
                MIN(cobraPcd) IS NOT NULL AND  
                MAX(cobraPcd) != MIN(cobraPcd) THEN  
         CASE WHEN MAX(cobraPcd) = 'No Contract No' THEN  
            MIN(cobraPcd)  
         WHEN MIN(cobraPcd) = 'No Contract No' THEN  
            MAX(cobraPcd)  
         ELSE  
            MAX(cobraPcd)  
         END  
      ELSE  
         MAX(cobraPcd)  
      END                                                                         as cobraPcd                    ,  
      CASE WHEN MAX(cobraCid) IS NOT NULL AND  
                MIN(cobraCid) IS NOT NULL AND  
                MAX(cobraCid) != MIN(cobraCid) THEN  
         CASE WHEN MAX(cobraCid) = 'No Contract No' THEN  
            MIN(cobraCid)  
         WHEN MIN(cobraCid) = 'No Contract No' THEN  
            MAX(cobraCid)  
         ELSE  
            MAX(cobraCid)  
         END  
      ELSE  
         MAX(cobraCid)  
      END                                                                         as cobraCid                    ,  
      MAX(benefitId                           )                                   as benefitId                      
   FROM meCostingXPrePrePre  
   GROUP BY matchKey;  
/* No commit yet. */

INSERT /*+ APPEND */ INTO meCostingXPrePre(  
   matchKey                    ,  
   contributionP               ,  
   stimulusContributionP       ,  
   contributionC               ,  
   ageMultiplier               ,  
   rateTableIdP                ,  
   rateTableIdC                ,  
   accountNbrP                 ,  
   accountNbrC                 ,  
   commissionExpenseAccount    ,  
   commissionReceivableAccount ,  
   commissionType              ,  
   commission                  ,  
   pmPm                        ,  
   fee                         ,  
   planAgeGroupIdP             ,  
   planAgeGroupIdC             ,  
   rafP                        ,  
   rafC                        ,  
   nbrEmployeesRafP            ,  
   nbrEmployeesRafC            ,  
   contractId                  ,  
   basePlanId                  ,  
   groupOrPolicyNumber         ,  
   planCoverageDescription     ,  
   cobraGopn                   ,  
   cobraPcd                    ,  
   cobraCid                    ,  
   benefitId                   ,  
   insuranceStart              ,  
   insuranceEnd                ,  
   categoryId                  )  
   SELECT 
      f.matchKey                    as matchKey                    ,  
      f.contributionP               as contributionP               ,  
      f.stimulusContributionP       as stimulusContributionP       ,  
      f.contributionC               as contributionC               ,  
      f.ageMultiplier               as ageMultiplier               ,  
      f.rateTableIdP                as rateTableIdP                ,  
      f.rateTableIdC                as rateTableIdC                ,  
      f.accountNbrP                 as accountNbrP                 ,  
      f.accountNbrC                 as accountNbrC                 ,  
      f.commissionExpenseAccount    as commissionExpenseAccount    ,  
      f.commissionReceivableAccount as commissionReceivableAccount ,  
      f.commissionType              as commissionType              ,  
      f.commission                  as commission                  ,  
      f.pmPm                        as pmPm                        ,  
      f.fee                         as fee                         ,  
      f.planAgeGroupIdP             as planAgeGroupIdP             ,  
      f.planAgeGroupIdC             as planAgeGroupIdC             ,  
      o.rafP                        as rafP                        ,  
      o.rafC                        as rafC                        ,  
      o.nbrEmployeesRafP            as nbrEmployeesRafP            ,  
      o.nbrEmployeesRafC            as nbrEmployeesRafC            ,  
      o.contractId                  as contractId                  ,  
      o.basePlanId                  as basePlanId                  ,  
      o.groupOrPolicyNumber         as groupOrPolicyNumber         ,  
      o.planCoverageDescription     as planCoverageDescription     ,  
      o.cobraGopn                   as cobraGopn                   ,  
      o.cobraPcd                    as cobraPcd                    ,  
      o.cobraCid                    as cobraCid                    ,  
      o.benefitId                   as benefitId                   ,  
      o.insuranceStart              as insuranceStart              ,  
      o.insuranceEnd                as insuranceEnd                ,  
      o.categoryId                  as categoryId                  ,  
      NULL                          as insuranceStart              ,  
      NULL                          as insuranceEnd                ,  
      NULL                          as categoryId                     
   FROM  
      meCostingXPrePreFirstHalf f  
         INNER JOIN meCostingXPrePreOtherHalf o  
         ON f.matchKey = o.matchKey;  
/* Now it is safe to commit. */
COMMIT;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 2018-09-14
    • 2022-01-22
    • 2019-12-27
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多