# [Oracle] Update über zwei Tabellen



## m3000 (31. August 2006)

Ich möchte ein Feld in tab1 mit einem Wert aus tab2.feld4 beschreiben. Dabei werden Bedingungen in tab2 erfüllt und natürlich Bedingungen für die Verknüpfung, damit das Feld mit der passenden Quelle beschrieben wird. Theoretisch würde ich mir sowas vorstellen:

```
update tab1
set tab1.feld4 = tab2.feld4
where tab2.xxx = [...]
and tab1.rec_key = tab2.rec_key;
```
Das geht aber nicht, weil die tab2-Felder nicht gefunden werden ("Invalid identifier"). Das ist logisch, weil ich die tab2-Tabelle ja nicht bekannt gegeben habe. Ich kann zwar in einem normalen select sagen "from tab1, tab2", das geht aber nicht im update. 

Einen möglichen Lösungsansatz habe ich dank Suchfunktion hier gefunden: Gleiche Frage. Aber das kann ich bei mir noch nicht anwenden. Geht das in Oracle? Wohin schreibe ich die where-Klauseln? 

Wer weiss Rat?

Dank und Gruss
Marcus


----------



## Exceptionfault (31. August 2006)

Ich hab hier grade leider keine Möglichkeit meine Sourcen zu testen, aber das wären 2 Ansätze die man mal testen könnte. Der zweite sollte in jedem Fall gehen, ist aber halt Oracle spezifisch. Beim ersten glaub ich weniger, dass es funktioniert ;-)

Ansatz mit Subquery:

```
UPDATE tab1
SET    tab1.feld4 = ( 
                    SELECT tab2.feld4 
                    FROM   tab2 
                    WHERE  xxx = [...] 
                    AND    tab2.rec_key = tab1.rec_key 
                    );
```

Ansatz mit MERGE Statement:

```
MERGE INTO tab1 t1
    USING (
        SELECT  feld4
        FROM    tab2
        WHERE   xxx = [...]
    ) t2
    ON (
        t1.rec_key = t2.rec_key
    )
    WHEN MATCHED THEN UPDATE SET 
        tab1.feld4 = t2.feld4;
```


----------



## m3000 (3. Oktober 2006)

Es ist offenbar so, dass das MERGE statement zwingend eine abschliessende Zeile WHEN NOT MATCHED THEN INSERT benötigt. 

Weitere Informationen: http://www.idevelopment.info/data/Oracle/DBA_tips/SQL/SQL_5.shtml

Deswegen kann zumindest ich nichts damit anfangen, denn ich will kein INSERT. 

Gruss
Marcus


----------



## Exceptionfault (3. Oktober 2006)

Sorry, da weicht wohl die 9i Syntax doch von der 10g ab. In 10g sind die UPDATE und INSERT Clause optional. In 9i müssen beide vorhanden sein, hast recht.


----------

