我有一个包含3列(a
,b
,c
)的表,并且我想确保对于前两列中每种可能的值组合,都有包含该组合的行。例如,如果这是我的桌子:
a b c
--- --- ---
P X 1
Q Y 2
Q Z 3
R Y 4
S Y 5
S Z 6
列a
中的唯一值是P
,Q
,R
,S
,列b
中的唯一值是X
,Y
,Z
。因此,我想创建一个返回12行(4×3)的查询,该查询用默认值(例如0)填充列c
中的缺失值,例如:
a b c
--- --- ---
P X 1
P Y 0
P Z 0
Q X 0
Q Y 2
Q Z 3
R X 0
R Y 4
R Z 0
S X 0
S Y 5
S Z 6
我目前的操作方式是:
select a, b, ifnull(c, 0)
from (select distinct a from table),
(select distinct b from table)
left join table using (a, b)
不幸的是,该查询非常慢,因为该表包含大约一万行。如果我预先计算查询并将其存储在表中,则访问结果会更快,但是会占用很多空间,其中大部分可能只是在c
列中填充了零。有什么方法可以使此查询更快?
答案 0 :(得分:1)
对于此查询:
select a.a, b.b, coalesce(c.c, 0)
from (select distinct a from table) a cross join
(select distinct b from table) b left join
table c
using (a, b);
您希望在以下位置建立索引:
(a, b)
(b)
第一个索引可用于select distinct a
和join
。第二个可用于select distinct b
。