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