View Full Version : sql update mit coalesce
Moin,
ein
update datei a set (f1, f2, f3) = (
select f1, f2, F3
from datei b
where a.feld = b.feld and b.xxx=1 and b.datum = (
select max(c.datum)
from datei c
where c.yyy = :wert and ... )
and ... )
where a.f1=' ' and a.f2 = ' ' and a.f3 = ' ' and ...
bricht ab und zu ab, weil es keine passenden Werte in Datei b gibt.
Wenn ich
update datei a set (f1, f2, f3) = (
select coalesce(f1, f2, F3
from datei b
where a.feld = b.feld and b.xxx=1 and b.datum = (
select max(c.datum
from datei c
where c.yyy = :wert and ... )
and ... , ' ', ' ', ' '))
where a.f1=' ' and a.f2 = ' ' and a.f3 = ' ' and ...
davon mache, ist die Syntax falsch.
muß ich das "and exists..." mit dem ganzen Gerödel machen oder gibt es eine Syntax die
mit dem coalesce funktioniert?
Danke
der ILEMax
Coalesce je Feld: coalesce(b.f1, a.f1), ....
Wobei der "where exists" effektiver (performanter) ist, da ja nicht so viel geändert werden muss.
Bei Journalisierung ist die Transaktion auch kleiner.
Danke, funktioniert erstmal
Bei Journalisierung ist die Transaktion auch kleiner.
Nicht-Änderungen werden weder protokolliert, noch werden die Sätze für commit gesperrt.
D*B
Ich häng mich mal hier rein, es funzt nicht ...
update TEMP#B/FILE XX
set (BEZ, WERT) =
(select coalesce(substr(a.INHACD, 01, 30), '*fehlt'),
coalesce(substr(b.INHACD, 24, 22), '*fehlt')
from CBUCHP a left outer join CBUCHP b
on a.FINR=b.FINR and a.SART=b.SART
and a.SPRC=b.SPRC and a.SAKZ=b.SAKZ
and substr(a.RKEY, 1, 2)=substr(b.RKEY, 1, 2)
and ' 01 ' =substr(b.RKEY, 3, 4)
where a.SART='ABCD ' and a.SAKZ='6'
and substr(a.RKEY, 1, 2)=digits(XX.BANK)
and substr(a.RKEY, 3) = ' ')
Wenn in CBUCH der Eintrag für eine Bank mit rkey 'bb ' fehlt (Banknr, rest Blank --> letzte substr)
bricht er ab mit "Nullwerte für Spalte oder Variable BEZ nicht zulässig".
Erwartet hätte ich '*fehlt' in dem Testsatz
Ist ja auch kein Wunder, dir fehlt der Where zum Update.
Wenn der Select nichts findet, wird insgesamt NULL zurück geliefert. Da kommt der innere Coalesce dann zu spät.
Also nach der letzten Klammer noch ein Where auf die Daten, die auch tatsächlich vorhanden sind.
Der Rowupdate erlaubt ja nun leider kein Gesamt coalesce.
Eine Idee hätte ich noch:
select .....
union values( xx.Bet, xx.Wert )
fetch first rows only
)
Besser wäre aber die Where-Klausel.
Danke erstmal,
Das SQL (ohne Coalesce) läuft schon seid Jahren fehlerfrei.
Es sollen ja auch alle Sätze geändert werden, daher kein Where.
Nur hat irgend ein Depp aus dem Codebuch einen Satz gelöscht, vermutlich aus versehen.
In xx.Bank habe ich z.B.
01
05
17
22
im Codebuch steht
01
01 01
05
05 01
17 01
22
22 01
ein where mit exists (oder was meinst du) würde ja verhindern, das der satz überhaubt geändert wird.
Aber den Wert aus den 17 01 hätte er ja setzen können.
also 2 Statement?
Robi
Du kannst es doch auch mal mit dem "union values('*fehlt', '*fehlt')" versuchen.
Um es noch komplizierter zu machen, wäre auch folgendes möglich:
Update ...
set (a, b) = values(
coalesce((select ...), '*fehlt')
,coalesce((select ...), '*fehlt')
)
Dies bedeutet dann allerdings 2 Singlevalue-Selects, wobei da dann jeweils das Coalesce auch entfallen kann.
Klar kannst du auch 2 Updates machen: 1. mit exists(...), 2 mit Konstanten und not exists (...).