我想在Postgres上運行一些更新查詢,這些查詢是在公共字段上加入表的。這是用SQL Server運行的,更新計數是1,這是預期的,而postgres的更新計數是3.似乎postgres不執行隱式連接,當目標表與連接中涉及的源表名稱相同時。該腳本可以更DESCRIPT比在說什麼,那就是: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;
但是這不是我的本意爲加盟條款可能涉及一些更多的聯合聲明。 期望意圖是運行這樣的查詢:
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更多。這怎麼可以重寫? 我的應用程序應該生成一個更新語句,這是統一的查詢應該運行,而行爲是不同的。顯然,加入是在選擇時執行的,而不是正在更新。
[從手動報價](https://www.postgresql.org/docs/current/static/sql-update.html):「*注意,目標表必須** **未出現在from_list ,除非你打算自我加入*「。你需要從'FROM'部分 –
刪除''IDMAP_TABLE_JOBID'一些聯接statements'有沒有這樣的事,作爲一個* JOIN語句*。 JOIN是一個二元**運算符**,它的操作數是兩個表(表達式),其結果是一個表表達式。 – wildplasser
@wildplasser我離題了。 SQL Server更新可以運行JOIN。可能不會使用術語,但可以通過SELECT with JOINS獲得相似性。 – dmachop