PDA

View Full Version : SQL Fehler bei Update über 2 Dateien



FNeurieser
11-12-20, 06:56
Hallo allerseits,

ich habe da wieder einmal ein Problem mit einem SQL-Statement und wende mich daher vertrauensvoll an euch.

In der Datei TESTFGN/ARTSTP soll das Feld ARLINR mit dem Wert des Feldes LIRWA aus der Datei TESTFGN/ZLFA geändert werden, wenn die ARLINR dem Feld LIWHG der Datei TESTFGN/ZLFA entspricht.

Folgendes Statement habe ich gezimmert:

UPDATE TESTFGN/ARTSTP A
SET ARLINR =
(SELECT B.LIRWA FROM TESTFGN/ZLFA B WHERE B.LIWHG = A.ARLINR)

Jetzt bekomme ich aber die Fehlermeldung:

Nullwerte für Spalte oder Variable ARLINR nicht zulässig.

Ich nehme mal an dass das auftritt wenn er keine Entsprechung in der Datei TESTFGN/ZLFA findet. Wie kann ich das umgehen?

Danke schon mal für eure Rückmeldungen.

LG
Franz-Georg

FNeurieser
11-12-20, 07:14
Kann es sein, dass das Statement wie folgt aussehen muss:

update testfgn/artstp a set a.arlinr =
coalesce((select b.lirwa from
testfgn/zlfa b where
a.arlinr = b.liwhg), 0)

???

B.Hauser
11-12-20, 07:31
Die richtige Syntax für einen Update über 2 Dateien sieht wie folgt aus:

update Tabelle1 a
set a.UpdFld = (Select b.UpdFldX
from Tabelle2 b
where a.Key1 = b.Key1 and a.Key2 = b.Key2 and ... a.KeyN = b.KeyN)
where Exists (Select * from Tabelle2 c
Where a.Key1 = c.Key1 and a.Key2 = C.Key2 and ... a.KeyN = c.KeyN)

Das ist die SQL Standard Syntax, ... auch wenn andere Datenbanken vereinfachte Update-Statements zulassen wird dies (zumindest vorerst) lt. Scott Forstie nicht in der Db2 for i implementiert.

Birgitta

FNeurieser
11-12-20, 08:08
Das ist die SQL Standard Syntax, ... auch wenn andere Datenbanken vereinfachte Update-Statements zulassen wird dies (zumindest vorerst) lt. Scott Forstie nicht in der Db2 for i implementiert.

Birgitta

Danke Birgitta, aber ist eigentlich mein Statement auch richtig oder falsch?

Fuerchau
11-12-20, 08:59
Im Prinzip Ja.
Durch den Coalesce erzeugst du einen Default, so dass auf jeden Fall ein Update erzwungen wird.
Von der Aufgabenstellung her kann das aber muss das nicht richtig sein.

Die Where-Klausel des Updates macht in soweit Sinn, dass weniger Updates überhaupt durchgeführt werden, wenn der Ursprungswert erhalten bleiben muss.

Alternativ kannst du auch dieses tun:

update testfgn/artstp a set a.arlinr =
coalesce((select b.lirwa from
testfgn/zlfa b where
a.arlinr = b.liwhg), a.arlinr)

Damit bleibt der Wert auch erhalten, allerdings wird die gesamte Tabelle geändert!

BenderD
11-12-20, 09:41
Im Prinzip Ja.
Durch den Coalesce erzeugst du einen Default, so dass auf jeden Fall ein Update erzwungen wird.
Von der Aufgabenstellung her kann das aber muss das nicht richtig sein.



... besser als der coalesce wäre es (wie so oft) null values zuzulassen.

D*B

FNeurieser
11-12-20, 10:15
@all

danke für die Infos

Fuerchau
11-12-20, 12:04
@D*B: dann würde ich in solchen Fällen u.U. mehr Daten kaputtmachen (mit NULL überschreiben) als gewünscht.

Bei Updates/Deletes sollte man qualifiziert über Where-Klauseln nachdenken;-).