Oracle SQL - Actualización de datos de la columna usando MENOS el operador

0

Pregunta

He esta consulta sql

(select x.a, x.b, x.c, x.d
from tableX x
where x.a IS NOT NULL
minus 
select y.a, y.b, y.c, y.d
from tableY y);

La anterior consulta devuelve todos me tableX de datos, que es diferente de tableY. Varias tuplas devueltas

Evidencia:

Cuando ejecuto la consulta de arriba me sale este resultado:

un b c
1 43 65
2 66 333

Cuando seleccione los datos de tableY me sale esto:

un b c
1 54 65
2 88 567

tableY datos son los datos correctos, por lo que quiero actualizar todas las tuplas que se devuelven desde la primera consulta(uno con MENOS cláusula) con los datos de tableY.

El resultado esperado, después de que la cláusula de actualización, cuando yo seleccione los datos de tableX debe ser:

un b c
1 54 65
2 88 567

¿Qué es lo más eficcient manera de hacer esta cláusula de ACTUALIZACIÓN?

oracle plsql sql
2021-11-23 19:18:31
2

Mejor respuesta

1

En oracle puedo encontrar la COMBINACIÓN de sintaxis mucho más útiles que la ACTUALIZACIÓN de la sintaxis...

MERGE INTO
  tablex   x
USING
  tabley   y
    ON (y.a = x.a)
WHEN MATCHED THEN UPDATE
  SET
    x.b = y.b,
    x.c = y.c
  WHERE
    LNNVL(x.b = y.b)
    OR
    LNNVL(x.c = y.c)

Edit: añadido cláusula where para evitar las actualizaciones redundantes, siguiente comentario a continuación.

2021-11-23 20:50:15

Son filas donde x.b = y.b y x.c = y.c incluido en la transacción?
jarlh

@jarlh Añadido una cláusula where a la WHEN MATCHED para evitar ese escenario.
MatBailie

esta solución resuelve mi pregunta, gracias
jct
0
update tablex
set (b, c) = (select b, c from tabley where tabley.a = tablex.a)
where exists (select 1 from tabley where tabley.a = tablex.a);

Para mantener el tamaño de la transacción abajo, añadir xb <> yb o xc <> yc:

update tablex
set (b, c) = (select b, c from tabley where tabley.a = tablex.a)
where exists (select 1 from tabley
              where tabley.a = tablex.a
                and (LNNVL(tabley.b = tablex.b) or LNNVL(tabley.c = tablex.c)));
2021-11-23 20:39:46

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................