繁体   English   中英

如何在Sqlalchemy中正确使用SQL连接/子查询

[英]How to correctly use SQL joins/subqueries in Sqlalchemy

说我有以下SQL代码,我想将其更改为Sqlalchemy:

SELECT amount FROM table1
JOIN table2 
  ON table2.id = table1.b_id
JOIN (SELECT id FROM table3 WHERE val1 = %s AND val2 = %s) inst
  ON inst.id = table1.i_id
WHERE
  val3 = %s

我尝试对SELECT id FROM table3子句进行子查询,如下所示:

subq = session.query(table3.id).filter(and_(table3.val1 == 'value', table3.val2 == 'value')).subquery()

然后将所有内容放在一起:

query = session.query(table1).join(table2).filter(table2.id == table1.b_id).\
join(subq).filter(table1.val3 == 'value')

当我输出query.first()。amount时,这适用于一些示例,但是对于某些查询,当应该有东西时,我没有任何结果,因此我必须在某个地方弄乱。 有什么想法我要去哪里吗? 谢谢

下面的查询应完全生成您拥有的SQL 它与您没有太大不同,但是删除了一些不必要的东西。
因此,如果它不起作用,那么您原来的SQL也可能不起作用。 因此,我假设您的问题不是SQL而是该查询的数据或参数。 而且,您始终可以通过engine.echo = True打印查询本身。

val1, val2, val3 = 'value', 'value', 'value'  # @NOTE: specify filter values
subq = (session.query(table3.id)
        .filter(and_(table3.val1 == val1, table3.val2 == val2))
        ).subquery(name='inst')

quer = (
    session.query(table1.amount)  # @NOTE: select only one column
    .join(table2)  # @NOTE: no need for filter(...)
    .join(subq)
    .filter(table1.val3 == val3)
).first()

print(quer and quer.amount)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM