如何使用sqlite中的默认值填写表中的缺失行

时间:2018-08-21 00:17:58

标签: sql sqlite

我有一个包含3列(abc)的表,并且我想确保对于前两列中每种可能的值组合,都有包含该组合的行。例如,如果这是我的桌子:

  a   b   c
 --- --- ---
  P   X   1
  Q   Y   2
  Q   Z   3
  R   Y   4
  S   Y   5
  S   Z   6

a中的唯一值是PQRS,列b中的唯一值是XYZ。因此,我想创建一个返回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列中填充了零。有什么方法可以使此查询更快?

1 个答案:

答案 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 ajoin。第二个可用于select distinct b