簡體   English   中英

SQLAlchemy查詢中有多個have語句

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM