问题描述
假设我有两个表:“calendar”和“sales”,其中日历表包含每一行的日期(yyyy-mm-dd 格式),而销售表包含 3 列,一列包含日期,一列有店名,有数量一个;像这样:
calendar:
date
==========
2021-03-01
2021-03-02
2021-03-03
...
sales:
date store quantity
==================================
2021-03-01 A 10
2021-03-01 B 6
2021-03-02 C 15
2021-03-04 A 8
...
从第 2 个表中可以看出,如果商店在特定日期的销售额为 0,则该行根本不存在。我想要实现的是填补空白的联合表,例如:
sales:
date store quantity
==================================
2021-03-01 A 10
2021-03-01 B 6
2021-03-01 C 0
2021-03-02 A 0
2021-03-02 B 0
2021-03-02 C 15
2021-03-03 A 0
2021-03-03 B 0
2021-03-03 C 0
...
我设法做到的方式是这样的:
SELECT c.date,s.store,t.sales
FROM calendar c
CROSS JOIN (SELECT DISTINCT store FROM sales) s
LEFT JOIN sales t
ON c.date = t.date
AND s.store = t.store
然而,这个查询对表“sales”执行了双重读取,我想避免这种情况,因为被扫描的数据相对较大。
有什么办法可以通过对表“sales”执行一次读取来获得相同的结果?
解决方法
解决您的问题的方法是使用一个名为 stores
的单独表。然后使用此表进行查询:
SELECT c.date,s.store,t.sales
FROM calendar c CROSS JOIN
stores s LEFT JOIN
sales t
ON c.date = t.date AND s.store = t.store;
只有一张桌子,这很棘手。我可以想到一些优化,但没有一个可以消除扫描。