テーブルが共通フィールドに結合されているPostgresでいくつかの更新クエリを実行しようとしています。これはSQL Serverで実行され、更新回数は1回、予想される更新回数は3回ですが、更新回数は3回です。接続先テーブルが結合に含まれているソーステーブルと同じ名前である場合、postgresは暗黙結合を実行しません。Postgresが参加時に不正確な更新
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;
上記のクエリをして簡素化することができる:
update test set col2 = 'changed'
from test2 where test.col1 = test2.col1;
が、JOIN句を伴う可能性があるとして、それは私の意図ではないスクリプトが言われているし、ここでそれが何であるかよりもDESCRIPT可能性いくつかの結合ステートメント 希望の意図は、このようなクエリを実行することでした:
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はIDMAP_CHILD_JOBIDがIDMAP_TABLE_JOBIDと同じであれば、複数回指定したテーブルと文句を言います。どのようにこれを書き直すことができますか? 私のアプリケーションは、統一されたクエリが実行されるはずの更新ステートメントを生成するはずですが、動作は異なります。 selectが更新されていない間にjoinが実行されることは明らかです。このSQLクエリの場合
[マニュアルの引用](https://www.postgresql.org/docs/current/static/sql-update.html): "*ターゲットテーブルはfrom_listに**表示されていない**あなたが自己結合を意図しない限り* "。あなたは 'FROM'の部分から' IDMAP_TABLE_JOBID'を削除する必要があります。 –
'いくつかの結合ステートメント'は* JOIN文*のようなものはありません。 JOINはバイナリ**演算子**であり、そのオペランドは2つのテーブル(-expression)であり、その結果はテーブル式です。 – wildplasser
@wildplasser私はそれを脱出する。 SQL Serverの更新プログラムはJOINを実行できます。用語は使用されないかもしれませんが、等価はJOINSのSELECTと同様に得ることができます。 – dmachop