ORA-00928: in MERGE

1

Good morning,

I am trying to update records from a CTE, however I am getting error ORA-00928:

I think I'm not missing anything, however, I can not get the update to run.

I attach the code that I am making. I hope you can guide me about it.



WITH CP AS( 
    SELECT 
      MAX(CODIGO_POSTAL) CODIGO_POSTAL
      ,MAX(ID_ENTIDAD) ID_ENTIDAD
      ,MAX(ID_MUNICIPIO) ID_MUNICIPIO
      ,MAX(MUNICIPIO) MUNICIPIO 
    FROM CODIGO_POSTAL
    GROUP BY CODIGO_POSTAL
    ORDER BY 1
),DATOS AS(
    SELECT
      NVL(B.CMUN_ID,0) B_CMUN_ID
      ,NVL(B.ID_ENTIDAD,0) B_ID_ENTIDAD
      ,NVL(B.ID_MUNICIPIO,0) B_ID_MUNICIPIO
      ,NVL(B.MUNICIPIO,'ND') B_MUNICIPIO
      ,DM.id_domicilio 
      ,DM.id_propietario
      ,DM.id_tipo_propietario
      ,DM.fecha_alta
      ,DM.id_localidad
      ,DM.codigo_postal
    FROM DOMICILIO DM
    LEFT JOIN MUNICIPIO B
        ON B.ID_ENTIDAD = DM.ID_ENTIDAD
       AND B.ID_MUNICIPIO = DM.ID_MUNICIPIO
    WHERE DM.id_tipo_propietario = 2
    AND NVL(B.ID_ENTIDAD,0) = 0
    ORDER BY DM.ID_PROPIETARIO
)

MERGE
INTO DOMICILIO DM 
USING (
  SELECT 
    DOM.ROWID row_id,
    CP.ID_ENTIDAD
  FROM DOMICILIO DOM
  INNER JOIN CP
    ON CP.CODIGO_POSTAL = DOM.CODIGO_POSTAL
  WHERE EXISTS  (SELECT 
                        DAT.id_propietario
                        FROM DATOS DAT
                        WHERE DAT.id_propietario = DOM.id_propietario
                        AND DAT.id_domicilio     = DOM.id_domicilio
                 )
  AND DOM.id_tipo_propietario = 2
  ) SRC ON (DM.ROWID = SRC.row_id ) 
WHEN MATCHED THEN UPDATE SET DM.ID_ENTIDAD = SRC.ID_ENTIDAD ;

Greetings.

    
asked by VLT 10.07.2018 в 19:15
source

1 answer

3

Inquiring a little more in CTE, I see that I can not use one without doing a SELECT on it ... so I solved it in the following way:



MERGE
INTO DOMICILIO DM 
USING (
WITH CP AS( 
    SELECT 
      MAX(CODIGO_POSTAL) CODIGO_POSTAL
      ,MAX(ID_ENTIDAD) ID_ENTIDAD
      ,MAX(ID_MUNICIPIO) ID_MUNICIPIO
      ,MAX(MUNICIPIO) MUNICIPIO 
    FROM CODIGO_POSTAL
    GROUP BY CODIGO_POSTAL
    ORDER BY 1
),DATOS AS(
    SELECT
      NVL(B.CMUN_ID,0) B_CMUN_ID
      ,NVL(B.ID_ENTIDAD,0) B_ID_ENTIDAD
      ,NVL(B.ID_MUNICIPIO,0) B_ID_MUNICIPIO
      ,NVL(B.MUNICIPIO,'ND') B_MUNICIPIO
      ,DM.id_domicilio 
      ,DM.id_propietario
      ,DM.id_tipo_propietario
      ,DM.fecha_alta
      ,DM.id_localidad
      ,DM.codigo_postal
    FROM DOMICILIO DM
    LEFT JOIN MUNICIPIO B
        ON B.ID_ENTIDAD = DM.ID_ENTIDAD
       AND B.ID_MUNICIPIO = DM.ID_MUNICIPIO
    WHERE DM.id_tipo_propietario = 2
    AND NVL(B.ID_ENTIDAD,0) = 0
    ORDER BY DM.ID_PROPIETARIO
)

SELECT 
    DOM.ROWID row_id,
    CP.ID_ENTIDAD
  FROM DOMICILIO DOM
  INNER JOIN CP
    ON CP.CODIGO_POSTAL = DOM.CODIGO_POSTAL
  WHERE EXISTS  (SELECT 
                        DAT.id_propietario
                        FROM DATOS DAT
                        WHERE DAT.id_propietario = DOM.id_propietario
                        AND DAT.id_domicilio     = DOM.id_domicilio
                 )
  AND DOM.id_tipo_propietario = 2
  ) SRC ON (DM.ROWID = SRC.row_id ) 
WHEN MATCHED THEN UPDATE SET DM.ID_ENTIDAD = SRC.ID_ENTIDAD ;

    
answered by 10.07.2018 / 19:34
source