如何选择一行,然后更新它(如果它的列值 =x),同时还使用带有 INNER JOIN 的行? PostgreSQL

问题描述 投票:0回答:1

在这种情况下,我有 2 个表:一个任务池表和一个订单表。

任务池

task_id(键) order_id(int) 状态(整数) expire_time(时间戳)
20 1 0 [时间戳]
25 2 1 [时间戳]

订单

order_id(键) 订单信息(varchar) 订单日期时间(时间戳)
0 “信息” [时间戳]
1 “信息” [时间戳]

现在,我使用任务表中的相关 order_id,使用此查询从订单表中检索 order_infoorder_datetime

WITH t AS (
        SELECT 
            task_id, 
            order_id,
            status
        FROM task_pool
        WHERE 
            task_id = $1 
            AND 
            (status = 0 OR status = 1)
    )
    SELECT  t.order_id, t.status,
            order_info, order_datetime
    FROM orders
    INNER JOIN t ON orders.order_id=t.order_id`,
[req.body.task_id]

这有效(最有效的方法,我不知道)。它只会检索 1 行,因为 task_id 是唯一索引键。

我想做的是检查 IF t.status=0,如果是,则将expire_time更新为expire_time + 10分钟,并将status更新为1。

我知道我可以在 Node.js 中检查 results.rows[0],如果 status==0,则进行另一个 pg 查询来更新该行的 expire_time 和 status。

但是,除非不建议,否则我更愿意在原始查询中完成所有操作。

类似:

WITH t AS (
            SELECT 
                task_id, 
                order_id,
                status
            FROM task_pool
            WHERE 
                task_id = $1 
                AND 
                (status = 0 OR status = 1)
            )
**IF t.status = 0 THEN
    UPDATE 
        task_pool 
    SET 
        status = 1, expire_time = expire_time + (10 * interval '1 minute')
    WHERE
        task_id = $1
END IF;**

SELECT  t.order_id, t.status,
        order_info, order_datetime
FROM orders
INNER JOIN t ON orders.order_id=t.order_id`,
    [req.body.task_id]

这可能吗?

postgresql
1个回答
0
投票

您可以将您的

select
换成针对同一行的
update..returning
,但根据您的条件更新它,然后返回新值:

WITH t AS (
        UPDATE task_pool
        SET status=case when status=0 
                        then 1 
                        else status 
                   end, 
            expire_time=case when status=0 
                             then expire_time+'10 min'::interval 
                             else expire_time 
                        end
        WHERE 
            task_id = $1 
            AND 
            (status = 0 OR status = 1)
        RETURNING 
            task_id, 
            order_id,
            status
    )
    SELECT  t.order_id, t.status,
            order_info, order_datetime
    FROM orders
    INNER JOIN t ON orders.order_id=t.order_id`,
[req.body.task_id]
© www.soinside.com 2019 - 2024. All rights reserved.