PDA

View Full Version : SQL not null



KingofKning
19-02-20, 10:39
Hallo *all,

ich habe hier zwei Dateien, dat013 mit 900 Einträgen und dat019 mit 600 Einträgen.

Folgendes SQL



update dat013 t01 set preisl = (select prindex from dat019 t02
where t01.debitor = t02.debitor
and prindex is not null)


Bekomme dann den Fehler



Nachricht . . . : Nullwerte für Spalte oder Variable PREISL nicht zulässig.
Ursache . . . . : Einer der folgenden Fehler ist aufgetreten: Spalte PREISL
ist eine Zielspalte in einer Anweisung UPDATE oder INSERT für Tabelle DAT013
in RPTRADE. Es wurde ein Nullwert festgelegt, um in dieser Spalte eingefügt
oder aktualisiert zu werden, oder es wurde kein Wert für die Spalte in einer
Anweisung INSERT angegeben und für die Spalte sind keine Nullwerte zulässig.
Der Nullwert wurde mit der relativen Eintragsnummer 1 in der Liste VALUES,
SELECT oder in der SET-Klausel angegeben.


Selbst wenn ich es so mache:

update dat013 t01 set preisl = (select prindex from dat019 t02
where t01.debitor = t02.debitor
and cast(prindex as dec(8)) > 0)

klappt es nicht.

Wo ist mein Denkfehler?
Definiert ist das Feld mit PRINDEX CHARACTER (10) NOT NULL DEFAULT NOT HIDDEN.

Beim datenimport hatte ich darauf geachtet keine NULL Werte zu haben.

GG 4119

Fuerchau
19-02-20, 10:59
Du hast keine Where-Klause für den Update selber.
Hier solltest du einen

where exists (select * from dat019 t03
where t01.debitor = t03.debitor
and cast(prindex as dec(8)) > 0)

anhängen.

KingofKning
19-02-20, 11:54
Danke, hatte ein ähnliches Beispiel im Forum gefunden aber die falschen Schlüsse gezogen

Fuerchau
19-02-20, 12:16
Wenn der scalare Subselect kein Ergebnis findet, gibts NULL.
Wenn den Zielfeld nun NULL erlaubt hätte, kannst du dir ja denken, was passiert wäre.

Leider kann SQL ja nicht wissen, was du willst, deshalb gibts was auf die Finger.
Man muss die Where-Klausel nun leider 2-Mal kodieren um eben keinen NULL-Wert zu erhalten.

Alternativ wäre auch folgendes:


update dat013 t01 set preisl = coalesce( (select prindex from dat019 t02
where t01.debitor = t02.debitor
and cast(prindex as dec(8)) > 0), preis1)

wobei halt in diesem Fall mehr Sätze als nötig geändert werden. Dies kann ebenso Konsequenzen bei Triggern und sonstigen Constraints haben.
Ganz zu schweigen von Satzsperren unter Transaktion.