【发布时间】: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