PDA

View Full Version : sql update mit coalesce



ILEMax
06-07-21, 10:28
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

Fuerchau
06-07-21, 11:54
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.

ILEMax
06-07-21, 14:01
Danke, funktioniert erstmal

BenderD
06-07-21, 14:36
Bei Journalisierung ist die Transaktion auch kleiner.

Nicht-Änderungen werden weder protokolliert, noch werden die Sätze für commit gesperrt.

D*B

Robi
10-08-21, 15:43
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

Fuerchau
10-08-21, 17:09
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.

Robi
11-08-21, 08:02
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

Fuerchau
11-08-21, 08:44
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 (...).