在特定条件下使用 merge 并使用 ROW_NUMBER 函数

Use merge with certain conditions and with ROW_NUMBER function

我正在尝试使用 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,' ','')) ,
                                TIT ,
                                BEN,
                                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' ,
                                LTRIM(CTA_REC,'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,
    TIT,
    BEN,
    BAN,
    CTA_EMI,
    CTA_REC,
    INST,
    TYPE_TRANS,
    TYPE_MOV,
    CONC,
    DATE_OPER,
    MONT,DIV,
    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  
    );

标记错误,在 AND ID_TRANS 之后缺少右括号不为空

仍在放置括号。

这里好像少了一个右括号:

                    ))                        --> 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
)