Oracle SQL - coluna de Atualização de dados usando o operador MINUS

0

Pergunta

Eu tenho essa 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);

A consulta acima retorna-me todos os tabelax de dados, que é diferente de tableY. Várias tuplas são retornadas.

Provas:

Quando eu executar a consulta acima eu obter esse resultado:

um b c
1 43 65
2 66 333

Quando eu selecionar dados de tableY eu posso conseguir isso:

um b c
1 54 65
2 88 567

tableY de dados os dados estiverem corretos, então eu quero atualizar todas as tuplas que são devolvidos a partir da primeira consulta(aquele com MENOS cláusula) com os dados da tableY.

O resultado esperado, após a cláusula de atualização, quando eu selecionar dados de tabelax deve ser:

um b c
1 54 65
2 88 567

O que é o mais eficcient maneira de fazer isso cláusula de ATUALIZAÇÃO?

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

Melhor resposta

1

No oracle acho a SÉRIE sintaxe muito mais útil do que a sintaxe UPDATE...

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: adicionado cláusula where para evitar redundante atualizações, o seguinte comentário abaixo.

2021-11-23 20:50:15

São linhas onde x.b = y.b e x.c = y.c incluídos na transação?
jarlh

@jarlh Adicionada uma cláusula where WHEN MATCHED para evitar esse cenário.
MatBailie

esta solução resolveu a minha pergunta, obrigado
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 manter o tamanho da transação para baixo, adicione xb <> yb ou 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

Em outros idiomas

Esta página está em outros idiomas

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