PDA

View Full Version : Update mittels SQL



FNeurieser
03-10-12, 13:13
Hallo allerseits,

ich hätte da wieder mal eine Frage an die SQL-Gurus unter euch.

Ich versuche 2, vom Satzaufbau gleiche Dateien miteinander zu vergleichen und die erste mit Werten der zweiten upzudaten:



UPDATE RWLEX777/EIGENV as A set A.EIMZWF = B.EIMZWF,
A.EIKTOS = B.EIKTOS, A.EIKSTS = B.EIKSTS, A.EIKTOH = B.EIKTOH,
A.EISTRF = 2 where A.EIBELN CONCAT A.EIPOS in(SELECT B.EIBELN
CONCAT B.EIPOS FROM RWLSAV777/EIGENV060 as B) AND A.EIBELN = 437152
Qualifikationsmerkmal für Spalte oder Tabelle B nicht definiert.


Aber wie ihr sehen könnt, erhalte ich obige Fehlermeldung. Kann mir bitte jemand dabei helfen?

Danke schon mal im voraus

Fuerchau
03-10-12, 13:20
Mit der Where-Klauses schränkst du die Suche nur ein erhältst aber keinen Zugriff auf das Ergebnis.
Für den Update gibt es 2 Varianten (je nach Release):


update file1 a
set
a.field1 = (select b.field1 from file2 b where a.key=b.key)
,a.field2 = (select b.field2 from file2 b where a.key=b.key)
:
:
where exists (select * from file2 b where a.key = b.key)

Ab neueren Releasen kann man das nun vereinfachen:

update file1 a
set (a.feld1, a.feld2 ...) = (select b.feld1, b.feld2 ... from file2 b where a.key=b.key)

where exists (select * from file2 b where a.key = b.key)

FNeurieser
03-10-12, 13:22
Hallo Fuerchau,

danke schon mal für die rasche und wie immer sehr detaillierte Hilfe. Eine kurze Frage noch zu den Releasen. Ab welchem Release funktioniert denn die 2. Variante eigentlich? Wir haben hier noch V5R4 im Einsatz.

Fuerchau
03-10-12, 13:25
Ab da müsste es gehen, versuchs doch einfach.

Fuerchau
03-10-12, 13:28
PS:
Dein "... where ... concat ... in (select ... concat ... )" ist die schlechteste Lösung überhaupt.
Wenn du einen Schlüssel (auch über mehrere Felder) hast ist ein "... exists (select ...)" der schnellste Weg (ich glaube seit V3).

FNeurieser
03-10-12, 13:35
Oh, danke für die Info; dann müsste das Statement für meine Zwecke also so lauten:?


update RWLEX777/EIGENV a
set (a.EIMZWF, a.EIKTOS, a.EIKSTS, a.EIKTOH) =
(select b.EIMZWF, b.EIKTOS, b.EIKSTS, b.EIKTOH from
RWLSAV777/EIGENV060 b where a.EIBELN=b.EIBELN and a.EIPOS=b.EIPOS)
where exists (select * from RWLSAV777/EIGENV060 b where
a.EIBELN=b.EIBELN and a.EIPOS=b.EIPOS)


Und genau so hat es dann funktioniert. Danke nochmal für die rasche Hilfe

Fuerchau
03-10-12, 13:44
Laut V5R4.Handbuch sollte das gehen.
Um die Syntax eines SQL's vor der Aktion zu prüfen kannst du im STRSQL per F13 Auswahl 1 ja die Option (ich weiß i.M. nicht welche, aber das siehst du ja) von *RUN auf *SYN umschalten.

FNeurieser
03-10-12, 18:09
Hallo Fuerchau,

danke nochmal das hat wunderbar funktioniert. Das mit dem Syntaxcheck habe ich - ich muss es gestehen - bis jetzt noch nicht verwendet. Einzig und allein die Sicherung der Sessions habe ich schon des öfteren verwendet.