【问题标题】:Update multiple columns from a subquery [duplicate]从子查询更新多个列[重复]
【发布时间】:2017-04-20 21:01:48
【问题描述】:

我想使用 SQLAlchemy 创建以下语句。它可以在数据库上完全执行,因此不涉及将任何数据检索到 sqlalchemy 层。

UPDATE summary s SET (sum_x, sum_y, avg_x, avg_y) =
  (SELECT sum(x), sum(y), avg(x), avg(y) FROM data d
     WHERE d.group_id = s.group_id);

非常感谢您的帮助

【问题讨论】:

  • 另外,WHERE 子句是否应该是子查询的一部分,或者它是否意味着是 UPDATE 的一部分(目前至少没有以任何明显的方式加入 data)?换句话说,括号是不是有点偏了?
  • 是的,他们是,你是对的。我会纠正他们

标签: python sqlalchemy


【解决方案1】:

你需要tuple_()self_group()correlated subquery

In [9]: from sqlalchemy import tuple_

In [10]: stmt = select([func.sum(data.c.x),
    ...:                func.sum(data.c.y),
    ...:                func.avg(data.c.x),
    ...:                func.avg(data.c.y)]).\
    ...:     where(data.c.group_id == summary.c.group_id)

In [11]: summary.update().\
    ...:     values({ tuple_(summary.c.sum_x,
    ...:                     summary.c.sum_y,
    ...:                     summary.c.avg_x,
    ...:                     summary.c.avg_y).self_group(): stmt })
Out[11]: <sqlalchemy.sql.dml.Update object at 0x7ff76a80a908>

In [12]: print(_)
UPDATE summary SET (sum_x, sum_y, avg_x, avg_y)=(SELECT sum(data.x) AS sum_1, sum(data.y) AS sum_2, avg(data.x) AS avg_1, avg(data.y) AS avg_2 
FROM data 
WHERE data.group_id = summary.group_id)

其余的(执行等)由您决定,因为问题很简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 2021-03-31
    • 1970-01-01
    相关资源
    最近更新 更多