Oracle
 sql >> Database >  >> RDS >> Oracle

AGGIORNAMENTO con sintassi JOIN per Oracle Database

La sintassi dell'istruzione UPDATE è:

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

dove dml_table_expression_clause è:

Si prega di prestare attenzione a ( subquery ) parte della sintassi di cui sopra.

La subquery è una funzionalità che consente di eseguire un aggiornamento dei join.

Nella forma più semplice può essere:

UPDATE (
   subquery-with-a-join
)
SET cola=colb

Prima di aggiornare un join, devi conoscere le restrizioni elencate qui:

https://docs.oracle.com/cd/B28359_01 /server.111/b28286/statements_8004.htm

  • Un operatore di insiemi
  • Un operatore DISTINCT
  • Una funzione aggregata o analitica
  • Una clausola GROUP BY, ORDER BY, MODEL, CONNECT BY o START WITH
  • Un'espressione di raccolta in un elenco SELECT
  • Una sottoquery in un elenco SELECT
  • Una sottoquery designata CON SOLA LETTURA
  • Partecipa, con alcune eccezioni, come documentato in Oracle Database Administrator's Guide

e anche regole comuni relative alle viste aggiornabili - qui (sezione:Updating a Join View ):
http://docs .oracle.com/cd/B19306_01/server.102/b14231/views.htm#sthref3055

Possiamo prima creare una sottoquery con un join:

SELECT age 
FROM ages a
JOIN names m ON a.id = m.id
WHERE m.name = 'Sally'

Questa query restituisce semplicemente il seguente risultato:

       AGE
----------
        30

e ora possiamo provare ad aggiornare la nostra query:

UPDATE (
    SELECT age 
    FROM ages a
    JOIN names m ON a.id = m.id
    WHERE m.name = 'Sally'
)
SET age = age + 1;

ma otteniamo un errore:

Questo errore significa che una delle limitazioni di cui sopra non è soddisfatta (tabella di conservazione delle chiavi).

Tuttavia, se aggiungiamo chiavi primarie alle nostre tabelle:

alter table names add primary key( id );
alter table ages add primary key( id );

quindi ora l'aggiornamento funziona senza alcun errore e un risultato finale è:

select * from ages;

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