[英]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.