繁体   English   中英

SQLAlchemy 在按商店过滤订单时丢失了日期和订单的左外连接。 我怎样才能防止这种情况?

[英]SQLAlchemy Left Outer Join on Dates and Orders is lost on filtering Orders by store. How can I prevent this?

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

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()
日期.day_date Orders.date_created 订单.销售
2021-02-01 2021-02-01 19:41:17 94.8
2021-02-02 没有任何 没有任何
2021-02-03 没有任何 没有任何
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
)
日期.day_date Orders.date_created 订单.销售
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 值,是否可以结合一个“或”加上一个“和”过滤器来解决这个问题?

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM