Hallo,
ich möchte gerne ein SQL-Statement folgender Art durchführen:
UPDATE
t_kvpos_log
SET trigger_changed =
(SELECT
t3.dtdatumpos
FROM t_kvpos_log t1
join t_kvpos t3 ON (t1.nkvposkey = t3.nkvposkey)
WHERE
t1.saenderungsprogramm != 'KV-Pos Neuanlage' AND
t1.saenderungsprogramm != 'Stornierung' AND
t1.nekpbrutto != 0 AND
t1.neinzelvkp = 0
)
WHERE trigger_id = t1.trigger_id
trigger_changed ist ein timestamp feld und soll mit dem Wert aus t_kvpos.dtdatumpos ersetzt werden.
Es sollen nicht alle Datensätze aus t_kvpos_log ersetzt werden, sondern nur diejenigen, deren Key gleich ist mit dem, aus der Unterabfrage t1.
Die Fehlermeldung, die ich erhalte lautet:
FEHLER: fehlender Eintrag in FROM-Klausel für Tabelle »t1«
SQL Status:42P01
Wie bringe ich jetzt dem äußeren Eintrag (UPDATE t_kvpos_log ) die Bekanntschaft zu t1 bei?
Ich habe noch folgendes probiert:
UPDATE
t_kvpos_log
SET trigger_changed = t3.dtdatumpos
FROM t_kvpos_log t2
join t_kvpos t3 ON (t2.nkvposkey = t3.nkvposkey)
WHERE
t2.saenderungsprogramm != 'KV-Pos Neuanlage' AND
t2.saenderungsprogramm != 'Stornierung' AND
t2.nekpbrutto != 0 AND
t2.neinzelvkp = 0 AND
trigger_id = t2.trigger_id
FEHLER: Spaltenverweis »trigger_id« ist nicht eindeutig
SQL Status:42702
Und das hier:
UPDATE
t_kvpos_log t1
SET t1.trigger_changed = t3.dtdatumpos
FROM t_kvpos_log t2
join t_kvpos t3 ON (t2.nkvposkey = t3.nkvposkey)
WHERE
t2.saenderungsprogramm != 'KV-Pos Neuanlage' AND
t2.saenderungsprogramm != 'Stornierung' AND
t2.nekpbrutto != 0 AND
t2.neinzelvkp = 0 AND
t1.trigger_id = t2.trigger_id
FEHLER: Fehler »Syntaxfehler« bei »t1«
SQL Status:42601
Zeichen:23
UPDATE
t_kvpos_log [color=Blue]upd[/color]
SET trigger_changed =
(SELECT
t3.dtdatumpos
FROM t_kvpos_log t1
join t_kvpos t3 ON (t1.nkvposkey = t3.nkvposkey)
WHERE
[color=Blue] upd.trigger_id = t1.trigger_id [/color]AND
t1.saenderungsprogramm != 'KV-Pos Neuanlage' AND
t1.saenderungsprogramm != 'Stornierung' AND
t1.nekpbrutto != 0 AND
t1.neinzelvkp = 0
)
das select “kennt” das update, aber nicht umgekehrt …
daher war dein naechstr gedanke natuerlich schon nicht verkehrt … du musst nur noch fuer die table die du updatest auch einen qualifier verwenden
UPDATE
t_kvpos_log
SET trigger_changed = t3.dtdatumpos
FROM t_kvpos t3
WHERE
t_kvpos_log.saenderungsprogramm != 'KV-Pos Neuanlage' AND
t_kvpos_log.saenderungsprogramm != 'Stornierung' AND
t_kvpos_log.nekpbrutto != 0 AND
t_kvpos_log.neinzelvkp = 0 AND
t_kvpos_log.nkvposkey = t3.nkvposkey;
UPDATE
t_inventur upd
SET nwarengruppekz =
(SELECT
t3.nwarengruppekz
FROM t_inventur t1
JOIN t_artikel t3 ON (t1.nartikelkey = t3.nartikelkey)
WHERE
upd.ninventurkey = t1.ninventurkey AND
t1.nekpaktuell > 1 AND
t1.nfilialekey IN (SELECT nfilialekey FROM t_filiale WHERE sistlager = '0')
)
bekomme ich folgene Fehlermeldung:
FEHLER: Fehler »Syntaxfehler« bei »t_inventur«
LINE 1: t_inventur upd
^
********** Fehler **********
FEHLER: Fehler »Syntaxfehler« bei »t_inventur«
SQL Status:42601
Zeichen:1
Wo liegt mein Fehler?
Ich verwende SQLManager 4,4,0,6 auf meinem Windows PC und der Server ist ein OpenSuse Linux mit Postgre in der Version 8.1.5
Bei PostgreSQL. In der Version 8.1 ist das ein Syntaxfehler, in 8.3 geht es .
test=# create table foo (i int, t text);
CREATE TABLE
test=*# insert into foo values (1,NULL);
INSERT 0 1
test=*# select version();
version
-------------------------------------------------------------------------------------------
PostgreSQL 8.1.4 on i386-pc-linux-gnu, compiled by GCC cc (GCC) 3.3.5 (Debian 1:3.3.5-13)
(1 row)
test=*# update foo foo_version set t = version() where i = 1;
ERROR: syntax error at or near "foo_version" at character 12
LINE 1: update foo foo_version set t = version() where i = 1;
versus:
test=# create table foo (i int, t text);
CREATE TABLE
Zeit: 159,728 ms
test=*# insert into foo values (1, NULL);
INSERT 0 1
Zeit: 0,344 ms
test=*# update foo foo_version set t = version() where i = 1;
UPDATE 1
Zeit: 0,960 ms
test=*# select * from foo;
i | t
---+-----------------------------------------------------------------------------------------------
1 | PostgreSQL 8.3.5 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu3)
(1 Zeile)