Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

UPDATE com sintaxe JOIN para Oracle Database


A sintaxe da instrução UPDATE é:

http://docs.oracle.com/cd/B19306_01 /server.102/b14200/statements_10007.htm



onde dml_table_expression_clause é:



Por favor, preste atenção em ( subquery ) parte da sintaxe acima.

A subquery é um recurso que permite realizar uma atualização de junções.

Na forma mais simples pode ser:
UPDATE (
   subquery-with-a-join
)
SET cola=colb

Antes de atualizar uma junção, você deve conhecer as restrições listadas aqui:

https://docs.oracle.com/cd/B28359_01 /server.111/b28286/statements_8004.htm
  • Um operador de conjunto
  • Um operador DISTINTO
  • Uma função agregada ou analítica
  • Uma cláusula GROUP BY, ORDER BY, MODEL, CONNECT BY ou START WITH
  • Uma expressão de coleção em uma lista SELECT
  • Uma subconsulta em uma lista SELECT
  • Uma subconsulta designada COM SOMENTE LEITURA
  • Juntas, com algumas exceções, conforme documentado no Oracle Database Administrator's Guide

e também regras comuns relacionadas a visualizações atualizáveis ​​- aqui (seção:Updating a Join View ):
http://docs .oracle.com/cd/B19306_01/server.102/b14231/views.htm#sthref3055

Podemos primeiro criar uma subconsulta com uma junção:
SELECT age 
FROM ages a
JOIN names m ON a.id = m.id
WHERE m.name = 'Sally'

Esta consulta simplesmente retorna o seguinte resultado:
       AGE
----------
        30

e agora podemos tentar atualizar nossa consulta:
UPDATE (
    SELECT age 
    FROM ages a
    JOIN names m ON a.id = m.id
    WHERE m.name = 'Sally'
)
SET age = age + 1;

mas recebemos um erro:

Este erro significa que uma das restrições acima não foi atendida (tabela preservada por chave).

No entanto, se adicionarmos chaves primárias às nossas tabelas:
alter table names add primary key( id );
alter table ages add primary key( id );

então agora a atualização funciona sem nenhum erro e um resultado final é:
select * from ages;

        ID        AGE
---------- ----------
         1         25
         2         31
         3         35