PDA

View Full Version : SQL Update Werte aus 2 Tabellen?



pabloesco
02-09-21, 17:20
Hallo Forum,

Ich habe folgendes SQL:

Ich würde gerne 3 Felder aktualisieren. 2 der Felder sind in test1 ​n und ein Feld ist in der Tabelle test2 ​ Gibt es eine Möglichkeit ein Update auf 2 Tabellen zu machen? Ich habe es mit einem join probiert hat aber leider nicht so funktioniert. Der Wert dem ich dem Feld aus der zweiten Tabelle vergeben will sollte konstant sein.

Ich stehe gerade etwas auf dem Schlauch und weiß nicht weiter. Evt. hat einer von euch einen Ansatz.


UPDATE test1 t1 <code class="hljs language-sql" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; box-sizing: inherit; background-color: transparent; white-space: inherit;">(t1.field,
t1.field,
t2.field = 5)</code>


UPDATE test1 t1
SET (t1.field,
t1.field,
t2.field) =
(SELECT test,
test,
test
FROM table(test_function(
02172,
'TEST',
date('2021-07-26'),
'TEST',
5455612)
)
join test2 t2 on t2.id = t1.id
where t1.test = test
and t1.test = test
);

Fuerchau
02-09-21, 17:34
Nein, das ist nicht möglich.
Der Update erlaubt nur als Ziel eine Tabelle.

Die Alternative ist eine neue Tabelle mit allen benötigten Felder und einem "Instead Of"-Trigger.
Der Trigger wird beim Update aufgerufen und kann dann 2 andere Tabellen mit Einzelupdates updaten.

Letztlich ist es aber dasselbe, da du 2 Updates auch selber kodieren kannst.
Empfehlenswert ist da natürlich Journalisierg und Commit=*CHG, da die 2 Updates ja im Kontext unteilbar sein sollen und das geht nur mit Transaktionen (Commit).

pabloesco
02-09-21, 17:47
Ok vielen dank @Fuerchau wie immer :-D Ich schau mir das mal mit dem Instead Of - Trigger an.
Aber mit zwei Einzelupdates hätte ich ja immer noch folgendes Problem:
Wie komme ich an die ID der akualisierten Zeile heran? Also ich aktualisiere eine oder mehrere Zeilen in der Tabelle T1 und will daraufhin die entsprechenden Zeilen in der T2 aktualisieren.

B.Hauser
02-09-21, 18:03
Ein Instead Of Trigger kann nur auf eine SQL-View erstellt werden. Damit musst Du zuerst eine View erstellen und dann den Instead of Trigger ...

Also ich würde das Ganze mit 2 unabhängigen Update-Statements erledigen.
Oder Du schreibst Dir ein kleines Progrämmchen (oder Stored Procedürchen), das die erste Datei in einer Schleife liest und dann den Update in der ersten und im Anschluss in der zweiten Datei erledigt. ... das ist sowie so die sauberste Lösung. Falls ein "fauler" Satz dabei ist, können die übrigen Sätze noch upgedated werden. Ansonsten heißt es nur alles oder nichts.

Birgitta

pabloesco
02-09-21, 18:11
@B.Hauser
selbst in einem Programm hätte ich ja aber immer noch das Problem der ID´s welches zu aktualisieren gibt in der zweiten Tabelle. Also die Funktion liefert mir X Werte aus die dann aktualisiert werden in der 2 Tabelle. mit IDENTITY_VAL_LOCAL() würde ich ja aber auch immer nur die letzte ID bekommen die aktualisiert wurde?

B.Hauser
02-09-21, 19:01
Identity_Val_Local ermittelt die letzte Id.
Wenn Du eine Schleife baust, dann kannst Du doch vor dem Update die Indentity ermitteln und dann damit den zweiten Update machen.

Fuerchau
03-09-21, 08:01
Nun ja, es gibt da noch den:

Select bla [into ...] from final table (update .....)
Select bla [into ...] from final table (insert ....)

Damit kannst du den Identity_Val_Local() vergesssen, da dieser
a) nur auf die letzte Identity funktioniert, die z.B. durch Trigger verfälscht werden kann
b) Du eine Identity-Column überhaupt erst mal haben musst.

Der "Select ... from final table ()" muss als Ergebnis genau nur 1 Satz zurückgeben.
Er liefert zusätzlich auch die Felder, die ggf. durch Default's oder Trigger ergänzt wurden.