【问题标题】:Postgres UPDATE statementPostgres 更新语句
【发布时间】: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;

欢迎任何指针。

【问题讨论】:

  • 所有示例仅指一个连接。我需要做多个连接。
  • 一表连接和多表连接在语法上没有区别
  • 您只使用左连接,是否有意 - 将任务表中没有 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 部分中使用子查询...

标签: postgresql sql-update postgresql-9.4


【解决方案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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    相关资源
    最近更新 更多