假设我有两个表:"日历";以及";销售";,其中,日历表包含每行的日期(以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
...
正如你从第二张表中看到的,如果一家商店在某一天的销售额为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
然而,该查询对表"执行双重读取;销售";,我想避免这种情况,因为正在扫描的数据相对较大。
有没有任何方法可以通过对表"执行一次读取来实现同样的结果;销售";?
问题的解决方案是使用一个名为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;
对于一张桌子来说,这很棘手。我可以考虑一些优化,但没有一个可以消除扫描。