我想根據另一個表(source
)中的值更新表(target
)。但我正在尋找一種可以在4個主要數據庫中工作的語法 - Oracle,MS SQL Server,PostgreSQL,MySQL。在主要數據庫中工作的UPDATE語法
到目前爲止,我無法找到這樣一個統一的語法。我錯過了這樣的語法還是真的沒有這樣的語法?
甲骨文
UPDATE target t
SET (t.col1, t.col2) = (SELECT s.col1, s.col2
FROM source s
WHERE s.key = t.key)
MS SQL服務器/ PostgreSQL的
UPDATE target t
SET t.col1 = s.col1, t.col2 = s.col2
FROM source s
WHERE t.key=s.key
MySQL的
UPDATE target, source
SET t.col1=s.col1, t.col2=s.col2
WHERE s.key=t.key
並不一定是低效 – Ben
@Ben不一定,但在給定的例子,將需要從源讀取兩次,而不是一次。我會認爲這是低效的。如果更新是5列,則需要5倍的讀取次數,如果不是簡單的表查詢,子查詢更復雜,那麼更多的工作正在重複。 – GarethD
我對1億行的測試(SQL Server)表明,當更新整個表時,如果有一個聚集索引,那麼每個額外的列會有20%到40%的懲罰,這些表是內存中的(希望所有時間)。這絕對有意義。所以我想這是維護多個查詢的維護頭痛與性能的重要性之間的一個折衷。 – Ben