2013-10-30 31 views
0

我想要做這樣的事情:如何使用連接語句更新Postgres表?

update t1 set t1.column1 = 'changed' 
from left outer join t2 on t1.dataid = t2.dataid 
where t2.column2 != 'foo'; 

基本上,我需要決定哪些t1記錄更新時檢查東西t2。我怎樣才能使這個句法正確?

+0

沒有在手冊中這樣的更新的例子:http://www.postgresql.org/docs/current/static/sql-update.html –

回答

1

而不是做一個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'); 
+0

這幾乎適用加盟T2,這裏是我的修正:'更新t1 set column1 ='changed' where exists(從t2中選擇1,其中t1.dataid = t2.dataid和t2.column2!='foo');'(從「t1.column1」中刪除't1.'這是造成一個錯誤,並改變了哪裏的邏輯,以適應我的具體情況。)謝謝! – BLuFeNiX

1

試着這麼做:

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

+0

這會給我一個暗示的「內部連接」。我需要一個'外連接'(我想影響與空連接的記錄)。 – BLuFeNiX

+0

@BLuFeNiX我用可能的方式更新了我的答案以進行左連接。 –

+0

剛剛嘗試和得到這個錯誤: 錯誤:無效引用FROM子句條目表「T1」 線4:留在t1.dataid = t2.dataid – BLuFeNiX