簡體   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