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