[英]Multiple having statements in a SQLAlchemy query
SQLAlechemy中的操作順序是什么? 理想的答案將提供一組通常適用的規則,而不是在特定示例的上下文中提供的解決方案。
這個問題的動機如下。 我正在從SQLite3數據庫中的多個表構建數據集。 我的查詢如下所示:
query = session.query( Customer, Application, Income, Spending ).\
join(
<USER-APPLICATION JOIN>
).\
join(
<USER-INCOME JOIN>
).\
join(
<USER-SPENDING JOIN>
).\
group_by(
User.id,
Application.date,
)
現在,我不想從這些表中提取所有內容,因此我在查詢中添加了一些過濾器。 例如:
query = query.\
filter(
Income.date <= Application.date
).\
having(
or_(
and_(
func.max(Spending.date) <= Application.date,
Spending.date == func.max(Spending.date)
),
and_(
func.max(Spending.date) > Application.date,
Spending.date < Application.date
),
and_(
func.min(Spending.date) > Application.date,
Spending.date == func.min(Spending.date)
)
)
).\
having(
Spending.date == func.max(Spending.date),
Income.date == func.max(Income.date)
)
但是,having語句彼此依賴,並且僅當第一個having語句在第二個having語句之前應用時,以上代碼才能執行我想要的操作。
那么這段代碼是否表現出我想要的方式? 另外,此行為是否取決於我使用的數據庫(將來可能要升級數據庫)?
如果是:
query.filter(...).having(...)
... filter()
成為WHERE子句的一部分, having()
成為HAVING子句的一部分。
WHERE子句適用於行預分組,而HAVING子句適用於組。 這樣,HAVING子句將隱式地限定為通過WHERE子句的行。
因此,您的代碼將按編寫時的方式正常運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.