【问题标题】:SQL UPDATE statement with LEFT JOIN, GROUP BY and HAVING?带有 LEFT JOIN、GROUP BY 和 HAVING 的 SQL UPDATE 语句?
【发布时间】:2021-06-24 13:45:04
【问题描述】:

我需要更新表格中的一些行。我创建了一个 Select 语句来确保我有我想要选择的行。

我想更新表任务中的 task_status_id,我尝试了各种方法,但总是以语法错误告终,并且老实说不知道该怎么做,即使我尝试通过使用来遵循其他示例INNER JOIN 并将 select 语句放在括号中。任何帮助将不胜感激。

UPDATE 语句与 SELECT 语句合并。

UPDATE task
SET task_status_id =  (SELECT task_status_id
                                FROM task_status
                                WHERE task_type_id = 1
                                AND name = 'Completed');

在哪里

SELECT
    t.task_id
FROM task t
         LEFT JOIN user u
                   ON t.user_id = u.user_id
         LEFT JOIN contract co
                   ON u.user_id = co.user_id
        LEFT JOIN task_status ts
            ON t.task_status_id = ts.task_status_id
WHERE co.status = 'Closed' AND
        t.task_type_id = 1 AND
      t.task_status_id != (SELECT task_status_id
                                FROM task_status
                                WHERE task_type_id = 1
                                AND name = 'Completed')
GROUP BY t.task_id
HAVING count(t.contract_id) <= 2;

【问题讨论】:

  • 首先:去掉(非)标量子查询。

标签: sql postgresql syntax sql-update


【解决方案1】:

首先,使用LEFT JOIN contract co 然后使用co.status = 'Closed' 过滤结果是没有意义的,因为如果您要按连接表中的列进行过滤,那么您应该使用INNER JOIN (除非您在过滤器中与null 进行比较)。

其次,这里的语法不正确——你应该使用not in而不是!=

  AND t.task_status_id != (SELECT task_status_id
                            FROM task_status
                            WHERE task_type_id = 1
                            AND name = 'Completed')

但是,由于您已经加入了 task_status 表,您可以将上面的代码块替换为以下代码(假设 task_status_id 是唯一列):

AND ts.name != 'Completed'

无论哪种方式,您都应该发布示例数据和预期结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-09
    • 2016-04-11
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 2013-12-09
    相关资源
    最近更新 更多