Anmelden

View Full Version : SQL Update 2 Dateien



moskito
30-08-06, 14:40
Wieder mal das leidige Thema: Ich möchte Daten aus Feldern der Datei 2 in Felder der Datei 1 updaten. Habe mich an die Syntax gehalten und bekomme jetzt Fehlenmeldungen, dass ein TOKEN falsch ist:

update mdv/fzs set (fszleasvar, fzsleasvnr, fzsleasend) = (select
vtyp, vnum, vende where fzskeyknd=mdv/lea.fzskeyknd)
Token FZSKEYKND ungültig. Gültige Token: , FROM INTO.

Der Cursor steht auf den farbig markierten Buchstaben. Was ist da falsch?

mk
30-08-06, 14:52
Hallo
hier ein Beispiel:

Wenn ich das richtig sehe fehlt das from auf die Datei

update asmtool/lprm01p A set LVAL=
( select lval from asmtoolold/lprm01p B
where a.lpgm = b.lpgm
and a.llnr = b.llnr
and a.lent = b.lent )

Gruss
Michael

moskito
30-08-06, 15:06
Das war es noch nicht. Jetzt kommt die Meldung

Ergebnis der Anweisung enthält mehr als eine Zeile.

Syntax:
update mdv/fzs set (fzsleasvar, fzsleasvnr, fzsleasend) = (select
fzsleasvar, fzsleasvnr, fzsleasend
from mdv/lea where fzskeyknd=lea.fzskeyknd)

Irgendwas ist noch falsch. Übrigens Datei 1 ist natürlich viel größer als Datei 2 und in Datei 2 sind demzufolge auch nicht alle Sätze zu finden. Es sollen die Felder der gefundenen Sätze in Datei 1 upgedated werden (scheußliches Wort).

JonnyRico
30-08-06, 15:18
Hi,

versuchs mal hiermit:

update mdv/fzs
set (fzsleasvar, fzsleasvnr, fzsleasend) =
(select fzsleasvar, fzsleasvnr, fzsleasend
from mdv/lea where fzskeyknd=lea.fzskeyknd)
where mdv/fzs.fzskeyknd in (Select fzskeyknd from mdv/lea where fzskeyknd=lea.fzskeyknd)

Auf jeden Fall muss da noch das Where ... In ... rein

Gruß

Sascha

moskito
30-08-06, 15:28
Habe den String wie folgt geändert:

update mdv/fzs set (fzsleasvar, fzsleasvnr, fzsleasend) = (select
fzsleasvar, fzsleasvnr, fzsleasend from mdv/lea where
fzskeyknd=lea.fzskeyknd)
where fzs.fzskeyknd in (select fzskeyknd from mdv/lea
where fzskeyknd=lea.fzskeyknd)

Resultat ist immer noch:
Ergebnis der Anweisung enthält mehr als eine Zeile.

Fuerchau
30-08-06, 17:30
Update mit Subselect MUSS genau eine 1:1-Beziehung liefern.
D.h.: in der Where-Bedingung muss der gesamte eindeutige Schlüssel genannt werden.

update ufile a set ... = (
select ... from qfile b where a.key=b.key)
where a.key in (select c.key from qfile c where ...)

.key muss der gesamte Schlüssel (a.key1=b.key1 and ...) sein, bei der in-Klausel darf ja leider nur ein Feld benannt werden, dieses muss dann zusammengebaut werden:

a.key1 concat a.key2 ... = c.key1 concat c.key2 ...

Ist eines der Felder numerisch, kann es per DIGITS bzw. CHAR in Alpha gecastet werden.

Dieses Problem ist in verschiedensten Varianten hier bereits beschrieben.