使用具有特定条件和 ROW_NUMBER 函数的合并

问题描述

我正在尝试使用row_number函数进行合并(插入和更新),以便ID_TRANS字段是唯一值,其余字段应用某些条件。但是在执行时出现了右括号错误,值得一提的是,我修改添加了括号,仍然没有解决

 MERGE  INTO TBL_TRANSAC trans
    USING (
    SELECT ID_TRANS,TIT,BEN,BAN,CTA_EMI,CTA_REC,INST,TYPE_TRANS,TYPE_MOV,CONC,DATE_OPER,MONT,DIV,ID_CONT
    
    FROM (
    SELECT T1.*,ROW_NUMBER() OVER (PARTITION BY T1.ID_TRANS ORDER BY T1.ID_TRANS DESC)ENUMERADO
     FROM (
                SELECT
    'speibco1_'||UPPER(REPLACE( AREA,' ',''))||
                               UPPER(REPLACE( FVALOR,''))||
                               UPPER(REPLACE( CLAVE_RASTREO,'')),BAN_EM_DES,REPLACE(UPPER(NO_TP_CTA_EMISOR),''),LTRIM(CTA_REC,'0'),'BAN ACTINVER','CTA_EXTER','SPEI ENTradA BCO',CONC_2,TO_DATE(TO_CHAR(FVALOR),'YYYY-MM-DD'),REPLACE(REPLACE(IMPORTE,'-','MXN','0')||'0999' 
        FROM (SELECT * 
                FROM IBM_I2.I2_SPEI   WHERE REPLACE(NO_TP_CTA_EMISOR,'') IS NOT NULL 
                        AND ID_OPERACION='0007'
                        AND ESTATUS='06'
                        AND CTA_REC NOT IN ('70000997','7909567'))
                        )
                          WHERE  ENUMERADO=1 
                         AND ID_TRANS IS NOT NULL                   
           )SPEI         
    ON (
          trans.ID_TRANS  = SPEI.ID_TRANS
    )
    WHEN MATCHED THEN
      UPDATE SET
        ID_TRANS = SPEI.ID_TRANS,TIT = SPEI.TIT,BEN= SPEI.BEN,BAN=SPEI.BAN_EMISOR,CTA_EMI=SPEI.CTA_EMI,CTA_REC =SPEI.CTA_REC,INST= SPEI.INST,TYPE_TRANS=SPEI.TYPE_TRANS,TYPE_MOV=SPEI.TYPE_MOV,CONC=SPEI.CONC,DATE_OPER=SPEI.DATE_OPER,MONT=SPEI.MONT,DIV= SPEI.DIV,ID_CONT= SPEI.ID_CONT
     
    
    WHEN NOT MATCHED THEN
      INSERT (
    ID_TRANS,ID_CONT
    )
    VALUES
    (
    SPEI.ID_TRANS,SPEI.TIT,SPEI.BEN,SPEI.BAN_EMISOR,SPEI.CTA_EMI,SPEI.CTA_REC,SPEI.INST,SPEI.TYPE_TRANS,SPEI.TYPE_MOV,SPEI.CONC,SPEI.DATE_OPER,SPEI.MONT,SPEI.DIV,SPEI.ID_CONT  
    );

标记错误,即在 ID_TRANS 后缺少右父母且 ID_TRANS 不为 NULL

仍然放置父母。

解决方法

似乎缺少右括号,这里:

                    ))                        --> here; should be 2,not only 1
                      WHERE  ENUMERADO=1 
                     AND ID_TRANS IS NOT NULL
,

为它们中的每一个加上括号和别名,以及在 USING 中调用的字段放置别名,然后就可以了。

FROM (SELECT * 
                    FROM IBM_I2.I2_SPEI   WHERE REPLACE(NO_TP_CTA_EMISOR,' ','') IS NOT NULL 
                            AND ID_OPERACION='0007'
                            AND ESTATUS='06'
                            AND CTA_REC NOT IN ('70000997','7909567')
                          )
                      )T1
                   )T2
                              WHERE  ENUMERADO=1 
                             AND ID_TRANS IS NOT NULL                   
               )SPEI  
ON (
      trans.ID_TRANS  = SPEI.C1_ID_TRANS
)