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';

參考鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM