Postgres 更新语句

Posted

技术标签:

【中文标题】Postgres 更新语句【英文标题】:Postgres UPDATE statement 【发布时间】:2015-04-14 11:51:21 【问题描述】:

我已从 mysql 迁移到 psql,但发现使用多个左连接很难理解 UPDATE 语句。

你会如何在 Postgres 中重写它? (我使用的是 postresql 9.4)

update task t 
    left join project p on t.project_id = p.id 
    left join client c on t.client_id = c.id 
    left join user u on t.user_id = u.id
set t.project_name = p.name, 
     t.client_name = c.name,
     t.user_name = u.name;

欢迎任何指针。

【问题讨论】:

***.com/search?q=[postgresql]+update+join 当然还有examples in the manual 所有示例仅指一个连接。我需要做多个连接。 一表连接和多表连接在语法上没有区别 您只使用左连接,是否有意 - 将任务表中没有 project 的行更新为空?与project 的内部连接类似于UPDATE task SET project_name = p.NAME ,client_name = c.NAME ,user_name = u.NAME FROM project p ON task.project_id = p.id LEFT JOIN client c ON task.client_id = c.id LEFT JOIN user u ON task.user_id = u.id;。要将LEFT JOINproject 一起使用,请执行自连接任务或在SET 部分中使用子查询... 【参考方案1】:

给你:

WITH task_data AS (
    SELECT t.id,
        p.name AS project_name,
        c.name AS client_name,
        u.name AS user_name
    FROM task t 
        LEFT JOIN project p ON t.project_id = p.id 
        LEFT JOIN client c ON t.client_id = c.id 
        LEFT JOIN "user" u ON t.user_id = u.id
)
UPDATE task t
FROM task_data d
SET
    project_name = d.project_name, 
    client_name = d.client_name,
    user_name = d.user_name
WHERE t.id = d.id

我很想知道是否有更有效的方法

【讨论】:

以上是关于Postgres 更新语句的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JSON 键的 postgres 更新语句中增加值

选择后postgres更新

为啥在我的 Postgres 函数中使用 IF 语句时出现语法错误?

SQL 语句,postgres的数据库的连表查询

从 postgres 日志中获取可执行查询

Postgres:如何在where语句中指定参数[重复]