Ich versuche, einige Update-Abfragen auf Postgres auszuführen, wo Tabellen in einem gemeinsamen Feld verbunden sind. Dies wird mit SQL Server ausgeführt, und die Anzahl der Aktualisierungen ist 1, während postgres die Anzahl der Aktualisierungen 3 beträgt. Postgres führt anscheinend keine implizite Verknüpfung durch, wenn die Zieltabelle denselben Namen wie die an der Verknüpfung beteiligte Quelltabelle hat. Das Skript könnte mehr descript sein als das, was gesagt wird, und hier ist es:Postgres inkorrektes Update bei Join
drop table test;
drop table test2;
create table test(col1 int, col2 varchar(10));
insert into test values(1, 'aaa');
insert into test values(2, 'bbb');
insert into test values(3, 'ccc');
create table test2(col1 int);
insert into test2 values(2);
select * from test;
select * from test2;
// Select join = rowcount 1
select count(*) from test t2, test2 t3
where t2.col1 = t3.col1;
// SQL Server update = 1; postgres =3
update test set col2 = 'changed'
from test t2, test2 t3
where t2.col1 = t3.col1;
Die obige Abfrage kann mit vereinfacht werden:
update test set col2 = 'changed'
from test2 where test.col1 = test2.col1;
aber das ist nicht meine Absicht, als die Klausel beinhaltet beitreten könnte einige weitere Join-Anweisungen. Die gewünschte Absicht war, eine Abfrage wie folgt auszuführen:
UPDATE IDMAP_CHILD_JOBID SET RESTORESUCCESS = IDMAP_TABLE_JOBID.RESTORESUCCESS, RESTOREERRMSG = IDMAP_TABLE_JOBID.RESTOREERRMSG
FROM CHILD, IDMAP_TABLE_JOBID
WHERE CHILD.ID = IDMAP_CHILD_JOBID.OLDID AND CHILD.FK1 = IDMAP_TABLE_JOBID.OLDID
AND IDMAP_TABLE_JOBID.RESTORESUCCESS = $FALSE
Postgres klagt mit Tabelle mehr als einmal angegeben, wenn IDMAP_CHILD_JOBID die gleiche wie IDMAP_TABLE_JOBID ist. Wie kann das umgeschrieben werden? Meine Anwendung soll eine Update-Anweisung generieren, wo diese einheitliche Abfrage ausgeführt werden soll, während das Verhalten anders ist. Es ist offensichtlich, dass die Verknüpfung bei Auswahl ausgeführt wird, während sie nicht aktualisiert wird.
[Zitat aus dem Handbuch] (https://www.postgresql.org/docs/current/static/sql-update.html): "* Beachten Sie, dass die Zieltabelle ** nicht ** in der Aus_liste erscheinen muss , es sei denn, Sie beabsichtigen einen Self-Join * ". Sie müssen 'IDMAP_TABLE_JOBID' aus dem' FROM'-Teil entfernen –
'einige weitere Join-Anweisungen' Es gibt keine solche * JOIN-Anweisung *. JOIN ist ein binärer ** Operator **, seine Operanden sind zwei Tabelle (-Ausdruck) s und sein Ergebnis ist ein Tabellenausdruck. – wildplasser
@wildplasser Ich schweife damit ab. SQL Server-Updates können JOINs ausgeführt werden. Die Terminologie wird möglicherweise nicht verwendet, aber die Äquivalenz kann ähnlich wie bei SELECT mit JOINS erhalten werden. – dmachop