sql - 如何以原子方式更新一个关系,结果接收一组与另一个关系连接的元组?

标签 sql postgresql

我有以下交易:

BEGIN;

    SELECT t1.a, t2.b
      FROM table1 t1
INNER JOIN table2 t2 ON (t1.c = t2.c)
     WHERE t1.cond;

     UPDATE table1
        SET d = 'Value'
      WHERE cond;

COMMIT;

因为我正在使用相同的条件更新同一个表,所以我可以执行以下操作,放弃对事务的需要:

   UPDATE table1
      SET d = 'Value'
    WHERE cond
RETURNING a;

这样,我将丢失 table2 中的 b 属性。我尝试了以下操作:

    SELECT t1.a, t2.b
      FROM table1 t1
INNER JOIN table2 t2 ON (t1.c = t2.c)
     WHERE t1.a IN (
                       UPDATE table1
                          SET d = 'Value'
                        WHERE cond
                    RETURNING a
                   );

和:

    SELECT t1.a, t2.b
      FROM table1 t1
INNER JOIN table2 t2 ON (t1.c = t2.c)
INNER JOIN (
               UPDATE table1
                  SET d = 'Value'
                WHERE cond
            RETURNING a
           ) u ON (t1.a = u.a);

这两个都产生了语法错误(第一个提示 UPDATE,第二个提示 SET)。

如有任何意见,我们将不胜感激。

最佳答案

像这样:

update table1 as t1
  SET d = 'Value'
from table2 as t2
where t1.c = t2.c
  and ...condition...
returning t1.a, t2.b;

关于sql - 如何以原子方式更新一个关系,结果接收一组与另一个关系连接的元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18067100/

相关文章:

postgresql - 如何在 PgTAP 中设置 pg_prove 的数据库密码?

json - Postgres 返回带组的 json

sql - 比较sql中的逗号分隔值

java - 连接 Esper 和 PostgreSQL

mysql - 如何在数据库中搜索子字符串?

mysql - NewSQL 与传统优化/分片

mysql - 如何返回连接表中所有不匹配的行,如果匹配则检查条件?

sql - 仅选择 "most complete"记录

sql - SQL中根据一串JOIN规则查找第一条记录

sql - 如何为每个外键选择有限数量的行? (以及如何指定关系)