PDA

View Full Version : SQL update



Robi
01-04-19, 14:53
Hallo zusammen,

vereinfachtes Bsp.
3 Dateien

select case when a.f1='J' then sum(a.f2) else sum(b.f2) end
from a left outer join b on a.f3=b.f3
left outer join c on c.f4=a.f4
group by c.f4

geht nicht, da a.f1 nicht im group ist
Schade, würde er erst den select bilden und dann groupen würde es gehen.

also so:
with xx as (select c.F4, case when a.f1='J' then sum(a.f2) else sum(b.f2) end as sme
from a left outer join b on a.f3=b.f3
left outer join c on c.f4=a.f4
group by a.f1, c.f4)
select f4, sum(sme) from xx group by f4

nun ist das Problem aber, das davor ein
Update d set f5 =( ... muß.
und das nicht geht.
Wie krig ich den Update hin ohne eine echteTemp Datei zu schreiben

In Worten
in abh. eines Kennzeichens aus Datei A brauch ich die Summe eines Feldes von Datei A oder Datei B, gegroupt auf einer Info aus Datei C um damit Datei D zu aktualisieren.

Danke
Robi

Fuerchau
01-04-19, 17:35
1.

select sum(case when a.f1='J' then a.f2 else b.f2 end)
from a left outer join b on a.f3=b.f3
left outer join c on c.f4=a.f4

Ggf. ist dieser Sum einfacher, da du a je Satz entscheiden muss.
Da du nun keinen Schlüssel hast, kannst du auch keinen Group By machen.

2.
With ist im skalaren Subselect nicht erlaubt.
Aber ggf. erledigt sich das ja auch durch den obigen Select.

Dies wäre dann vielleicht so:

update a
set a.f5 = coalesce((select sum bla von oben.....), a.f5)
where bla

Zu bedenken ist noch, dass der skalare Select ja noch eine Beziehung zum Updatesatz herstellen sollte da sonst jeder das selbe bekommt, also

set x.f5 = coalesce((select sum bla von oben..... where x.key = a.key), x.f5)
where bla

Robi
02-04-19, 08:18
Hallo und danke,
Leider geht das nicht, ich habe einen Fehler in MEINEM Bsp oben.
Ich brauche den Group.

so ist das Bsp nötig


select c.f4, case when a.f1='J' then sum(a.f2) else sum(b.f2) end
from a left outer join b on a.f3=b.f3
left outer join c on c.f3=a.f3
group by c.f4


Ergebnis
C.F4 Wert
1 1000
5 953
20 52771
...

noch ne Idee?

mache (für den Update) z.zt 2 Läufe, einen auf a einen auf b


oh, in deiner Version geht der Group, klappt also!! Danke

Fuerchau
02-04-19, 08:31
Ggf. brauchst du den Group ja doch nicht?

set x.f5 = coalesce((select sum bla von oben..... where x.f4 = a.f4), x.f5)
where bla

Robi
02-04-19, 09:33
nein, das Prob. ist, a.F4 gibt es nicht.

BenderD
02-04-19, 10:15
... der Group by summiert (oder whatever) ein ResultSet und liefert ein ResultSet. Für den update mit subselect brauchst Du genau einen Satz, mit anderen Worten: die group by Felder wandern in die where clause des subselects und die group by clause fällt weg, da jetzt ja über alle summiert wird.

D*B

Fuerchau
02-04-19, 13:39
Da hörst du Dieter.
Ich hätte es einfacher gesagt: Ein skalarer Subselect darf nur 1 Feld und 1 Satz als Ergebnis liefern.
Group by macht da keinen Sinn, da du dann nur die Gruppe liefern könntest und da gibts schnellere Wege.

Aber es muss doch eine Beziehung des Group-By-Feldes zur Update-Datei geben?
Oder schränkst du den Update noch zusätzlich ein?
Was und wie klappt denn nun das, was du vorhast?

Robi
02-04-19, 15:32
So habe ich es nun gemacht


update DATEI_D set d_wert =COALESCE((
SELECT SUM(CASE WHEN a.f1='J' then b.f2 else a.f2 end)
FROM Datei_A a LEFT OUTER JOIN Datei_b b ON
a.k1 = b.k1 and a.k2 = b.k2 and ...
LEFT OUTER JOIN Datei_c c ON
a.k1 = c.k1 and ...
WHERE a.Fx = 1 and a.Fy = 0 AND a.Fz = 0 and c.F4 = D.F4
and a.Fxx = 2019 AND d.Fx= 201901
GROUP BY c.F4 ), 0)
WHERE d.fx= 201901 AND d.fy =201901

Fuerchau
02-04-19, 15:51
Das kann dann nur funktionieren, wenn c.F4 nur genau 1 Wert enthält und dann kannst du hier den Group by auch ebenso weglassen.
Oder wie verlinkst (joinst) du da nun von Datei_D auf die Daten des Subselects, so dass nur 1 Wert für c.F4 vorkommt?

Robi
02-04-19, 16:46
a oder b wird summiert
a und b sind miteinander und mit c verknüpft

a:c = n:1
b:c = n:1
a:b = 1:n

d hat n Sätze mit c.f4 was aber durch die anderen Bedingungen zu einem 1:1 wird.

Ob ich den Group weglassen kann?
müsste ich mal versuchen, so finde ich es auf jeden Fall lesbarer

Danke
Robi