【问题标题】:SQLAlchemy Left Outer Join on Dates and Orders is lost on filtering Orders by store. How can I prevent this?SQLAlchemy Left Outer Join on Dates and Orders 在按商店过滤订单时丢失。我怎样才能防止这种情况?
【发布时间】:2021-06-17 05:55:17
【问题描述】:

我有一个有效的左连接,但是一旦我添加一个过滤器以仅选择来自特定商店的订单,左外连接就会变成一个正常的连接,并且我会丢失没有订单的日期。

db.session.query(
        Dates.day_date,
        Orders.date_created,
        Orders.sales
    ).select_from(
        Dates
    ).outerjoin(
        Orders, Dates.day_date == cast(Orders.date_created, Date)
    ).filter(
        Dates.day_date == Orders.date_created
    ).group_by(
                Orders.date_created,
                Dates.day_date
    ).all()
Dates.day_date Orders.date_created Orders.sales
2021-02-01 2021-02-01 19:41:17 94.8
2021-02-02 None None
2021-02-03 None None
2021-02-04 2021-02-04 19:21:13 24.8
2021-02-05 2021-02-05 13:44:47 44.4

只要我在下面添加过滤器,我就会松开连接,表中的空列就会消失。如何保留 Dates.day_date 值?

.filter(
        Orders.store_id == store.id
)
Dates.day_date Orders.date_created Orders.sales
2021-02-01 2021-02-01 19:41:17 94.8
2021-02-04 2021-02-04 19:21:13 24.8
2021-02-05 2021-02-05 13:44:47 44.4

---编辑--- @van 解决了这个问题

db.session.query(
        Dates.day_date,
        Orders.date_created,
        Orders.sales
    ).select_from(
        Dates
    ).outerjoin(
        Orders, Dates.day_date == cast(Orders.date_created, Date)
    ).filter(or_(
        Orders.store_id == store.id,
        Orders.store_id == None
    )).group_by(
        Orders.date_created,
        Dates.day_date
    ).all()

我现在唯一的问题是,当我使用多个商店数据进行测试时。我过滤了特定的 store.id,但是当我正在过滤的商店的订单数据中没有值但在其他商店中没有值时,丢失的行仍然存在。我认为“Orders.store_id == None”在所有商店中都在寻找 None 值,是否可以结合使用 'or' 和 'and' 过滤器来解决这个问题?

【问题讨论】:

    标签: python join sqlalchemy


    【解决方案1】:

    这正是SQL 查询的行为方式:假设Orders 表没有行,过滤器(转换为WHERE 子句)将不匹配,因此不会返回该行.

    事实上,我认为即使是.filter(Dates.day_date == Orders.date_created) 也可能会过滤那些没有订单的行。同样的条件已经是.outerjoin 条件的一部分。

    解决方案:您可以做的是使用OR 条件:

    .filter(
        or_(
            Orders.id == None,
            Orders.store_id == store.id,
        )
    ) 
    

    【讨论】:

    • 完美!感谢@van 的澄清,我仍在尝试了解 SQL 的工作原理,感谢您的指导。
    • 嗨@van,感谢您之前的帮助,在我使用其他商店数据进行测试之前,它运行良好。当一个商店中没有值但另一个商店中没有值时,缺少的日期行似乎仍然存在。有任何想法吗?谢谢你的时间
    • 似乎“Orders.store_id == None”正在所有商店中寻找 None 值,我将如何解决这个问题,我想不出如何解决?再次感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 2021-09-08
    • 2022-01-22
    相关资源
    最近更新 更多