PDA

View Full Version : geht dieser SQL-Befehl auch einfacher?



rebe
12-02-02, 12:49
Hallo!

Ich möchte mehrere Felder einer Datei mit den Feldern einer anderen Datei ändern.
An sich kein Problem. Ich möchte nur gerne wissen, ob die folgende Syntax auch noch einfacher geht, falls ich in der Zukunft noch mehr Felder habe.

update auftpf1 a set
aufzntureg=(select kdszntureg from kdstpf1 b
where a.auffirma=b.kdsfirma and a.aufkundnr=b.kdskundnr),
aufzntreg=(select kdszntreg from kdstpf1 b where a.auffirma=b.kdsfirma and
a.aufkundnr=b.kdskundnr),
aufzntreg2=(select kdszntreg2 from kdstpf1 b where a.auffirma=b.kdsfirma and
a.aufkundnr=b.kdskundnr),
aufverksch=(select kdsverksch from kdstpf1 b where a.auffirma=b.kdsfirma and
a.aufkundnr=b.kdskundnr)
where aufkundnr in (select kdskundnr
from kdstpf1 c where a.auffirma=c.kdsfirma)

Vielen Dank.
Reiner

rmittag
12-02-02, 13:07
das kommt darauf an http://www.as400-forum.de/ubb/wink.gif, für 4.4 ist die Syntax :
http://publib.boulder.ibm.com/pubs/html/as400/v4r4/ic2924/info/db2/rbafzmstupdt.htm#HDRUPDT

da geht es also

Gruß Rolf

Fuerchau
13-02-02, 08:51
Auch wenn Sie obigem Link folgen, werden Sie sehen, dass Ihre Syntax genau die einzige Möglichkeit ist, mehrere Felder aus einer anderen Tabelle upzudaten.
Da je mehrere Subselect durchgeführt werden, wird auch die Performance entsprechend darunter leiden.

Die schnellste Möglichkeit ist hier, ein SQL-Programm zu schreiben, dass den gewünschten Update durchführt.

Als Alternative kann ich nur noch mein Tool SQLCPY unter www.fuerchau.de (http://www.fuerchau.de) anbieten, dass genau für solche Fälle entwickelt wurde.

rmittag
13-02-02, 13:13
wenn man obigem link folgt ...



create table qtemp/test1
( feld1 dec ( 5, 1)
, feld2 dec ( 5, 1)
, feld3 dec ( 5, 1)
, feld4 dec ( 5, 1)
);

create table qtemp/test2
( feld1 dec ( 5, 1)
, feld2 dec ( 5, 1)
, feld3 dec ( 5, 1)
, feld4 dec ( 5, 1)
);

create table qtemp/test3
( feld1 dec ( 5, 1)
, feld2 dec ( 5, 1)
, feld3 dec ( 5, 1)
, feld4 dec ( 5, 1)
);

insert into qtemp/test1 values( 1, 1, 1, 1);
insert into qtemp/test1 values( 2, 2, 2, 2);
insert into qtemp/test1 values( 3, 3, 3, 3);
insert into qtemp/test1 values( 4, 4, 4, 4);
insert into qtemp/test1 values( 5, 5, 5, 5);
insert into qtemp/test1 values( 6, 6, 6, 6);

insert into qtemp/test2 values( 1, 1, 1, 1);
insert into qtemp/test2 values( 2, 2, 2, 2);
insert into qtemp/test2 values( 3, 3, 3, 3);
insert into qtemp/test2 values( 4, 4, 4, 4);
insert into qtemp/test2 values( 5, 5, 5, 5);
insert into qtemp/test2 values( 6, 6, 6, 6);

insert into qtemp/test3 values( 1, -1, -1, -1);
insert into qtemp/test3 values( 2, -2, -2, -2);
insert into qtemp/test3 values( 3, -3, -3, -3);
insert into qtemp/test3 values( 4, -4, -4, -4);
insert into qtemp/test3 values( 5, -5, -5, -5);
insert into qtemp/test3 values( 6, -6, -6, -6);

update qtemp/test1 x
set (feld2, feld3, feld4) =
(select b.feld2, b.feld3, b.feld4
from qtemp/test2 a
join qtemp/test3 b on
b.feld1 = a.feld1
where a.feld1 = x.feld1
);


wenn man das in ein sorce member stellt und mit



SQL-Anweisungen ausführen (RUNSQLSTM)

Auswahl eingeben und Eingabetaste drücken.

Quellendatei . . . . . . . . . . SRCFILE > SQL
Bibliothek . . . . . . . . . . > SD_G
Quellenteildatei . . . . . . . . SRCMBR > ##TEST##
COMMIT-Steuerung . . . . . . . . COMMIT *NONE
Benennung . . . . . . . . . . . NAMING > *SYS

Zusätzliche Parameter

Datumsformat . . . . . . . . . . DATFMT > *ISO


ausführt, bekommt man als Protokoll



MSG ID WTK SATZ TEXT
SQL7950 0 2 Position 1 Tabelle TEST1 in QTEMP erstellt.
SQL7950 0 10 Position 1 Tabelle TEST2 in QTEMP erstellt.
SQL7950 0 18 Position 1 Tabelle TEST3 in QTEMP erstellt.
SQL7956 0 25 Position 1 1 Zeilen in TEST1 in QTEMP eingefügt.
SQL7956 0 26 Position 1 1 Zeilen in TEST1 in QTEMP eingefügt.
SQL7956 0 27 Position 1 1 Zeilen in TEST1 in QTEMP eingefügt.
SQL7956 0 28 Position 1 1 Zeilen in TEST1 in QTEMP eingefügt.
SQL7956 0 29 Position 1 1 Zeilen in TEST1 in QTEMP eingefügt.
SQL7956 0 30 Position 1 1 Zeilen in TEST1 in QTEMP eingefügt.
SQL7956 0 32 Position 1 1 Zeilen in TEST2 in QTEMP eingefügt.
SQL7956 0 33 Position 1 1 Zeilen in TEST2 in QTEMP eingefügt.
SQL7956 0 34 Position 1 1 Zeilen in TEST2 in QTEMP eingefügt.
SQL7956 0 35 Position 1 1 Zeilen in TEST2 in QTEMP eingefügt.
SQL7956 0 36 Position 1 1 Zeilen in TEST2 in QTEMP eingefügt.
SQL7956 0 37 Position 1 1 Zeilen in TEST2 in QTEMP eingefügt.
SQL7956 0 39 Position 1 1 Zeilen in TEST3 in QTEMP eingefügt.
SQL7956 0 40 Position 1 1 Zeilen in TEST3 in QTEMP eingefügt.
SQL7956 0 41 Position 1 1 Zeilen in TEST3 in QTEMP eingefügt.
SQL7956 0 42 Position 1 1 Zeilen in TEST3 in QTEMP eingefügt.
SQL7956 0 43 Position 1 1 Zeilen in TEST3 in QTEMP eingefügt.
SQL7956 0 44 Position 1 1 Zeilen in TEST3 in QTEMP eingefügt.
SQL0088 0 46 Position 1 UPDATE gilt für die gesamte Tabelle.
SQL7957 0 46 Position 1 6 Zeilen in TEST1 in QTEMP aktualisiert.


und ein schneller Blick in die Tabelle bestätigt das :



select * from qtemp/test1

....+....1....+....2....+....3....+...
FELD1 FELD2 FELD3 FELD4
1,0 1,0- 1,0- 1,0-
2,0 2,0- 2,0- 2,0-
3,0 3,0- 3,0- 3,0-
4,0 4,0- 4,0- 4,0-
5,0 5,0- 5,0- 5,0-
6,0 6,0- 6,0- 6,0-
******** Datenende ********