Search code examples
sqloracle-databasemergerow-number

Use merge with certain conditions and with ROW_NUMBER function


I am trying to do a merge (insert and update) with the row_number function so that the ID_TRANS field are unique values ​​in the remaining fields apply certain conditions. But when executing it I get a right parenthesis error, it is worth mentioning that I have modified and added parentheses and it remains unresolved.

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

MARK ERROR THAT MISSING RIGHT PARENTESIS AFTER AND ID_TRANS IS NOT NULL

STILL PLACING THE PARENTESIS.


Solution

  • Put parentheses and aliases to each of them, as well as the fields that are called in USING put aliases, and that worked.

    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
    )