我想要做這樣的事情:如何使用連接語句更新Postgres表?
update t1 set t1.column1 = 'changed'
from left outer join t2 on t1.dataid = t2.dataid
where t2.column2 != 'foo';
基本上,我需要決定哪些t1
記錄更新時檢查東西t2
。我怎樣才能使這個句法正確?
我想要做這樣的事情:如何使用連接語句更新Postgres表?
update t1 set t1.column1 = 'changed'
from left outer join t2 on t1.dataid = t2.dataid
where t2.column2 != 'foo';
基本上,我需要決定哪些t1
記錄更新時檢查東西t2
。我怎樣才能使這個句法正確?
而不是做一個LEFT JOIN,這是簡單的建立在相關的其它表在WHERE子句中,來自關聯表的值不必傳輸到更新的表中。
它應該是這樣的:
update t1 set t1.column1 = 'changed'
where not exists (select 1 from t2 where t1.dataid = t2.dataid and t2.column2='foo');
這幾乎適用加盟T2,這裏是我的修正:'更新t1 set column1 ='changed' where exists(從t2中選擇1,其中t1.dataid = t2.dataid和t2.column2!='foo');'(從「t1.column1」中刪除't1.'這是造成一個錯誤,並改變了哪裏的邏輯,以適應我的具體情況。)謝謝! – BLuFeNiX
試着這麼做:
update t1
set t1.column1 = 'changed'
from t2
where t1.dataid = t2.dataid
and t2.column2 != 'foo';
如果你真的需要外連接嘗試類似:
update t1
set t1.column1 = 'changed'
from (select 1 as dummy) dummy_table
left join t2 on t1.dataid = t2.dataid
and t2.column2 != 'foo';
還沒有測試 - 它可能無法正常工作。
另一種可能的方法是做一個內部連接到的t1
「複製」,然後做一個左連接到t2
沒有在手冊中這樣的更新的例子:http://www.postgresql.org/docs/current/static/sql-update.html –