PDA

View Full Version : SQL - Update mit Subselects



Tobse77
20-02-09, 08:03
Hallo zusammen,

möchte eine Datei in Abhängigkeit einer anderen Datei nur dann updaten, wenn dort der enstprechende Satz gefunden wurde:

update v#vsta00
set vvswg0 = case when (select budget
from budms09 where kdnr = vskdnr AND 'BUD99' = vstnr) <> 0 then
(select budget
from budms09 where kdnr = vskdnr AND 'BUD99' = vstnr) else vvswg0 end,

...

where exists (Select budget from budms09 where vskdnr = kdnr)
;;

Ursprünglich dachte ich, dass ich mir die Case-Anweisung sparen kann, weil ich ja in den Where-Bedingungen mit exists auf die Existenz der Subselect-Sätze abfrage. Dies führt jedoch stets zu der Meldung, dass keine NULL-Werte in das Feld vvswg0 geschrieben werden dürfen.

Meine Case-Anweisung ist allerdings auch nicht ganz richtig, da das Feld Budget durchaus den Wert 0 haben darf, welcher hierüber jedoch auch abgefangen wird.
Mit NOT NULL anstelle von <> 0 hab ich es schon versucht - Syntaxfehler.

Wer weiß, wie es funktioniert?

-- Tobias

Fuerchau
20-02-09, 08:09
Wenn auch mit 0 upgedatet werden darf, wenn keine Daten vorhanden sind dann gehts mit:

update v#vsta00
set vvswg0 = coalesce(select budget
from budms09 where kdnr = vskdnr AND 'BUD99' = vstnr), 0)

Ansonsten fehlt dir noch die 2. Bedingung:


update v#vsta00
set vvswg0 = (select budget
from budms09 where kdnr = vskdnr AND 'BUD99' = vstnr)
where exists (Select budget from budms09 where vskdnr = kdnr AND 'BUD99' = vstnr)

Tobse77
20-02-09, 08:21
Hallo Fuerchau,

vielen Dank für die prompte Antwort.
Es lag an der 2. Bedingung im exists. Ich hab's eben selbst gemerkt, aber bevor ich meine Frage löschen konnte, bist du schon draufgekommen.
Coalesce passt hier leider nicht, denn wenn nichts gefunden wurde, dann soll der alte Wert in vvswg0 bestehen bleiben.

-- Tobias

Fuerchau
20-02-09, 08:35
Naja, das geht ja auch:

update v#vsta00
set vvswg0 = coalesce(select budget
from budms09 where kdnr = vskdnr AND 'BUD99' = vstnr), vvswg0)

Mit dem exists reduzierst du nur die Anzahl Updates, wass ggf. schneller wird.