2012-08-11 49 views
0

我有一個SQL問題。SQL:使用另一個表中的行替換表中的行

我有兩個表:tableA和tableB。這兩個表具有完全相同的結構(簡體版):

rowid : big int 
name: character varying 
enabled : boolean 

兩個表:

tableA contains all the data and their enabled columns are all true. 
tableB contains data in tableA that should be turned off (enabled set to false). 

我的問題是,我怎麼能寫SQL語句與替換TableA中的所有行tableB中的行(或類似地,對於tableB中存在的所有行,將enabled字段設置爲false)

我使用PostgreSQL。來自其他SQL類型的SQL語句也是受歡迎的。

非常感謝。

回答

2

有很多方法可以做到這一點。 嘗試:

UPDATE TableA 
SET Enabled = false 
WHERE rowid IN 
(SELECT rowid FROM TableB) 
+0

@KZhang請注意,「IN(SELECT ...)」縮放比例很差,結果數量很大 - 速度很慢。您最好使用UPDATE ... FROM的連接更新;見歐文的答案。還要小心「IN」如何與空值行爲。 – 2012-08-12 03:12:11

3

這會做(但語法是MSSQL,THX兼容@評論):

update tableA 
    set tableA.enabled = false 
from tableA 
    inner join tableB on tableA.rowid = tableB.rowid 
+1

在PostgreSQL中,你不能在'SET'子句中對列進行表格限定。另外,不需要在'FROM'子句中再次添加'tableA'。 – 2012-08-11 23:58:20

+2

除非要使用outer或join,否​​則不需要再次在FROM子句中添加tableA。沒有任何進展支持'UPDATE ... FROM OUTER JOIN'或同等體系。 – 2012-08-12 03:07:51

1
UPDATE tbl_a a 
SET enabled = FALSE 
FROM tbl_b b 
WHERE a.rowid = b.rowid 
AND a.enabled IS NOT FALSE; 

如果enabled定義NOT NULL簡化爲:

AND a.enabled; 

不要在目標 柱的規格包括表的名稱 - 例如,UPDATE tab SET tab.col = 1是無效的。

  • 在PostgreSQL,另一個表有FROM條款加入到UPDATE說法是不只是更優雅,也比使用IN (subselect)更快。對於小的更新幾乎不重要,但可以用大的更新。用EXPLAIN ANALYZE進行測試。對於任何RDBMS:避免空更新。如果表A中的行已關閉,則不要應用更新。它不會更改數據,但仍會創建一個死行,可能會觸發觸發器並降低性能和磁盤空間。

相關問題