Update mit dem Ergebnis eines Subselects.

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

Weiß jemand Rat?
Gruß Ingo

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

Danke schön:

Habs jetzt mit folgendem Statement gelöst:

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;

Hier nochmals eine Frage zum gleichen Thema:

Auf folgendes Statement:

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)

Andreas