Anmelden

View Full Version : SQL Update aus zwei Dateien mit 3 Schlüsselfeldern



Seiten : [1] 2

mk
06-10-06, 13:15
Hallo zusammen,

ich weiß das wir das Thema schon öfter behandelt haben,
aber nach langer Suche und Versuchen will es mir einfach
nicht gelingen.

Ich habe zwei Dateien mit gleichem Aufbau. Es soll ein
UPDATE auf ein Feld von Datei 1 mit Wert aus Datei 2 erfolgen.

In Datei zwei sind aber nicht alle Schlüsselkombinationen
enthalten.

update mk/lprm01p A set LVAL=
( select c.lval from mk/lprm01p c
join mk/lprm01pold b
on c.lpgm = b.lpgm
and c.llnr = b.llnr
and c.lent = b.lent )

Die Aweisung bringt die Meldung
Ergebnis der Anweisung enthält mehr als eine Zeile


Kann mir vielleicht jemand auf die Sprünge helfen.

Vielen DAnk

Fuerchau
06-10-06, 13:19
Anhang:

update ....
)
where a.key1 concat a.key2 ... in (select x.key1 concat x.key2 ... from datei x)

mk
06-10-06, 13:41
Hallo Baldur,

wenn ich dich richtig verstanden habe dann sollte es doch so aussehen


update mk/lprm01p A set LVAL=
( select b.lval from mk/lprm01pold B
join mk/lprm01p C
on c.lpgm = b.lpgm
and c.llnr = b.llnr
and c.lent = b.lent )
where a.lpgm concat a.llnr concat a.lent
in (select b.lpgm concat b.llnr concat b.lent
from mk/lprm01pold b)


Damit kommt aber auch die Meldung
Ergebnis der Anweisung enthält mehr als eine Zeile.



Ich hab's einfach nicht mit SQL. Vielleicht sollte ich mir
einkleines Pgmle schreiben.

Gruss
Michael

B.Hauser
06-10-06, 14:00
Hallo,

versuch's mal mit der folgenden Syntax:


update MyTable2 A
set (A.Feld1, A.Feld2) = (select Distinct B.Feld1, B.Feld2
from Mytable1 B
where A.Key1 = B.Key1
and A.Key2 = B.Key2
and A.Key3 = B.Key3)
where exists (select C.Key1, C.Key2
from MyTable1 C
where A.Key1 = C.Key1
and A.Key2 = C.Key2
and A.Key3 = C.Key3)


Überigens die Lösung mit der IN-Anweisung und verketteten Feldern dürfte zu einer reichlich schlechten Performance führen, da der Optimizer für diesen SUB-Select keinen vorhandenen Zugriffs-Pfad verwenden kann, sondern einen Table Scan machen wird. Der Grund dafür liegt darin, dass durch das Verketten (Concat) ein neues Feld generiert wird, für das weder ein Zugriffs-Pfad vorhanden ist, noch angelegt werden kann.

Birgitta

mk
06-10-06, 14:16
Hallo Birgitta,

das war des Rätsels Lösung.

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


where exists
(select c.lpgm , c.llnr, c.lent
from mk/lprm01pold c
where a.lpgm = c.lpgm
and a.llnr = c.llnr
and a.lent = c.lent )



Vielen Dank euch beiden für die Hilfe

und viele Grüße
Michael

Fuerchau
06-10-06, 15:06
Das mit dem DISTINCT solltest du aber nicht so als Grundsatz verstehen, da du damit nur das Problem mehrerer Zeilen für genau diesen einen Fall ausschließt.

Aufgrund der Where-Klausel kann es trotzdem zu mehreren Sätzen kommen, wenn die Beziehung nicht EINDEUTIG mit einer 1:1-Beziehung vorhanden ist.
Deine Schlüssel vermuten da eher eine 1:N-Beziehung.

mk
06-10-06, 15:29
Nochmals DANKE

Habe das ganze auch ohne Distinct laufen lassen,
und es klappt.

Gruss Michael

MWendel
12-07-12, 15:44
Also ich habe gedacht das ich gut bin was SQL angeht, aber DB2 hatte ich immer Schwierigkeiten, bin halt nen MS SQL Programer ;-)

Aber wenn ich sowas lese muss ich echt sagen
RESPEKT

da kann selbst ich was lernen.

schönen Tag

Martin

Fuerchau
12-07-12, 15:47
MS SQL kann sowas aber auch.
Es kommt da weniger auf die Syntax und Funktionen an sondern mehr auf den Lösungsansatz.

MWendel
12-07-12, 15:56
Das stimmt,
aber am SQL Server würde ich das ganz anders machen

in etwa so:

UPDATE Tabelle A
SET A.sdsd=B.sdsd, A.afaf=B.afaf
FROM Tabelle A LEFT JOIN Tabelle2 B
ON a.s = B.s and A.f = B.f and A.i =B.i
WHERE ....

so würde ich das da machen, und mache ich auch :-)

bis dann
Martin