1. 程式人生 > >PostgreSQL - update語句怎麼關聯多個表

PostgreSQL - update語句怎麼關聯多個表

問題

對於select語句,我們可以通過join/outer join來關聯多個表;但是對於update語句,是不能直接通過join/outer join來關聯多表資料的,這裡僅針對PostgreSQL。

或者說,在PostgreSQL中,就算使用update+join不會報錯,但join的那部分其實是沒任何效果的,如下所示:

update a
set value = 'test'
from a
join b on a.b_id = b.id
join c on b.c_id = c.id
where
a.key = 'test'
and c.value = 'test';

按照上邊的sql,本意是a、b、c三表關聯,當c的value是’test’且a的key也是’test’的時候,就將a的value也改為’test’。但實際上這個sql有大問題,這裡的join和where條件並沒有意義,一旦update成功,你會發現,a表內的所有資料的value都被改成了’test’!!要麼update 0條資料,要麼全部update!至於是哪種結果,這要看where的條件,目前還不清楚為什麼會這樣。因為這種寫法本身就是不對的

PostgreSQL中正確的多表關聯update寫法

在update語句中不應該通過join來進行多表關聯,而是要通過from來多表關聯

,如下:

update a
set value = 'test'
from b,c
where
a.b_id = b.id
and b.c_id = c.id
and a.key = 'test'
and c.value = 'test';

通過from來多表關聯,而關聯條件則是放到了where中,這樣就可以達到我們想要的效果了。另外補充一句,對於set xxx = 'xxx'這個update的部分,是不可以在column欄位前加上表字首的,比如下邊的寫法就是有語法錯誤的:

update a
set a.value = 'test';

參考連結