【发布时间】:2020-03-16 15:35:18
【问题描述】:
我有一个包含两个子查询的查询。在 SQL 中大致如下:
SELECT sq2.foo,
sq2.bar
FROM (
SELECT foo FROM bar WHERE foo = '123'
) AS sq1,
LATERAL (
SELECT foo, bar FROM bar WHERE s1.foo = 'zomething'
) AS sq2
WHERE sq2.foo = 'something';
这就是我需要的 SQLAlchemy。当我把它翻译成炼金术时,我大致得到了这个:
sq1 = session.query(Bar.foo).filter(Bar.foo == '123').subquery()
sq2 = session.query(Bar.foo).filter(sq1.foo == 'zomething').subquery().lateral()
session.query(sq2.foo, sq2.bar).filter(sq.foo = 'something').all()
但是,这不会转化为与顶级 SQL 相同的 SQL,而是像这样嵌套查询:
SELECT sq2.foo,
sq2.bar
FROM LATERAL (
SELECT foo, bar FROM (
SELECT foo FROM bar WHERE foo = '123'
) AS sq1,
bar
WHERE sq1.foo = 'zomething'
) AS sq2
WHERE sq2.foo = 'something';
这不会产生相同的结果,原因可能过于复杂,无法根据这个简化的示例进行解释。但是,如果我将最终查询更改为包含 sq1 中我并不真正需要的内容,SQLAlchemy 确实会做正确的事情,如下所示:
session.query(sq2.foo, sq2.bar, sq1.foo).filter(sq.foo = 'something').all()
现在它返回具有正确结构的查询。有没有办法在不包含无价值数据的情况下强制并排子查询?
【问题讨论】:
标签: python postgresql flask sqlalchemy