2017-04-20 170 views
0

我想使用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); 

你的幫助是非常讚賞

+0

另外,如果WHERE子句是子查詢的一部分,還是意味着它是UPDATE的一部分(它目前至少不以任何明顯的方式加入* data *)?換句話說,括號有點偏離? –

+0

是的,他們是,你是對的。我會糾正它們 – Juergen

回答

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) 

其餘的(執行等)是你的,因爲這個問題是光詳細信息。