sql >> Databasteknik >  >> RDS >> Oracle

UPPDATERA med JOIN-syntax för Oracle Database

Syntaxen för UPDATE-satsen är:

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

där dml_table_expression_clause är:

Var uppmärksam på ( subquery ) en del av ovanstående syntax.

subquery är en funktion som gör det möjligt att utföra en uppdatering av anslutningar.

I den enklaste formen kan det vara:

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

Innan du uppdaterar en anslutning måste du känna till begränsningarna som anges här:

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

  • En uppsättningsoperator
  • EN DISTINKT operator
  • En aggregerad eller analytisk funktion
  • EN GROUP BY, ORDER BY, MODEL, CONNECT BY eller START WITH-sats
  • Ett samlingsuttryck i en SELECT-lista
  • En underfråga i en SELECT-lista
  • En underfråga betecknad MED ENDAST läs
  • Gå med, med vissa undantag, enligt dokumentationen i Oracle Database Administrator's Guide

och även vanliga regler relaterade till uppdateringsbara vyer - här (avsnitt:Updating a Join View ):
http://docs .oracle.com/cd/B19306_01/server.102/b14231/views.htm#sthref3055

Vi kan först skapa en underfråga med en join:

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

Denna fråga returnerar helt enkelt följande resultat:

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

och nu kan vi försöka uppdatera vår fråga:

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

men vi får ett felmeddelande:

Detta fel betyder att en av ovanstående begränsningar inte uppfylls (nyckelbevarad tabell).

Men om vi lägger till primärnycklar till våra tabeller:

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

då fungerar uppdateringen utan några fel och ett slutligt resultat är:

select * from ages;

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



  1. Får fel 1366. Felaktigt heltalsvärde:'1' vid import av fil

  2. Extraherar endast datum från datetime-fältet (mysql) och tilldelar det till php-variabel

  3. Får du antalet rader infogade för ON DUPLICATE KEY UPDATE multipel infogning?

  4. Ladda upp CSV-fil till SQL-server