Syntaxe příkazu UPDATE je:
http://docs.oracle.com/cd/B19306_01 /server.102/b14200/statements_10007.htm
kde dml_table_expression_clause
je:
Věnujte prosím pozornost ( subquery )
část výše uvedené syntaxe.
subquery
je funkce, která umožňuje provádět aktualizaci spojení.
V nejjednodušší formě to může být:
UPDATE (
subquery-with-a-join
)
SET cola=colb
Před aktualizací připojení musíte znát omezení uvedená zde:
https://docs.oracle.com/cd/B28359_01 /server.111/b28286/statements_8004.htm
- Operátor množiny
- DISTINCT operátor
- Agregační nebo analytická funkce
- klauzule GROUP BY, ORDER BY, MODEL, CONNECT BY nebo START WITH
- Výraz kolekce v seznamu SELECT
- Poddotaz v seznamu SELECT
- Poddotaz označený POUZE PRO ČTENÍ
- Připojuje se, až na některé výjimky, jak je zdokumentováno v Příručce správce databáze Oracle
a také společná pravidla související s aktualizovatelnými pohledy – zde (sekce:Updating a Join View
):
http://docs .oracle.com/cd/B19306_01/server.102/b14231/views.htm#sthref3055
Nejprve můžeme vytvořit poddotaz se spojením:
SELECT age
FROM ages a
JOIN names m ON a.id = m.id
WHERE m.name = 'Sally'
Tento dotaz jednoduše vrátí následující výsledek:
AGE
----------
30
a nyní se můžeme pokusit aktualizovat náš dotaz:
UPDATE (
SELECT age
FROM ages a
JOIN names m ON a.id = m.id
WHERE m.name = 'Sally'
)
SET age = age + 1;
ale dostaneme chybu:
Tato chyba znamená, že není splněno jedno z výše uvedených omezení (tabulka se zachovalými klíči).
Pokud však do našich tabulek přidáme primární klíče:
alter table names add primary key( id );
alter table ages add primary key( id );
pak nyní aktualizace funguje bez jakékoli chyby a konečný výsledek je:
select * from ages;
ID AGE
---------- ----------
1 25
2 31
3 35