下面是我为说明我想要实现的目标而制作的一个粗略示例:
表1:
| Shop | Product | QuantityInStock |
| a | Prod1 | 13 |
| a | Prod3 | 13 |
| b | Prod2 | 13 |
| b | Prod3 | 13 |
| b | Prod4 | 13 |
表1变为:
| Shop | Product | QuantityInStock |
| a | Prod1 | 13 |
| a | Prod2 | 0 | -- new
| a | Prod3 | 13 |
| a | Prod4 | 0 | -- new
| b | Prod1 | 0 | -- new
| b | Prod2 | 13 |
| b | Prod3 | 13 |
| b | Prod4 | 13 |
在这个例子中,我想表示每个商店/产品组合
每个商店{a,b}与每个产品{Prod1,Prod2,Prod3,Prod4}有一行
QuantityInStock=13没有意义,我只是想要一个占位符编号:(
使用日历表交叉联接方法:
SELECT s.Shop, p.Product, COALESCE(t1.QuantityInStock, 0) AS QuantityInStock
FROM (SELECT DISTINCT Shop FROM table1) s
CROSS JOIN (SELECT DISTINCT Product FROM table1) p
LEFT JOIN table1 t1
ON t1.Shop = s.Shop AND
t1.Product = p.Product
ORDER BY
s.Shop,
p.Product;
这里的想法是通过交叉连接生成一个包含所有商店/产品组合的中间表。然后,我们将其加入table1
。任何与在实际表格中匹配的商店/产品组合都被分配为零库存数量。