如何使用sqlite中的默认值填充表中缺少的行

如何使用sqlite中的默认值填充表中缺少的行,sql,sqlite,Sql,Sqlite,我有一个包含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 --- --

我有一个包含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
列中填充了零。有什么方法可以加快查询速度吗?

对于此查询:

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)

第一个索引可用于
选择不同的a
连接
。第二个可以用于
选择不同的b

我不知道如何加速
笛卡尔积。这里有一些不错的评论:。您更关心的是性能还是磁盘空间?性能更重要。