将两个表合并为一个带有可选外键的表

时间:2016-05-26 17:50:16

标签: sql sqlite

举个例子,我们有两个表:

Foo {
   Id;
   value1;
   value2;
   barId;
}

Bar {
   Id;
   value3;
}

在以前版本的应用中,value3是可选的;因此,我们把它放在一个单独的表中。现在我们决定将其作为必填字段并修改数据库模式,如下所示:

Foo {
   Id;
   value1;
   value2;
   value3;
}

在迁移过程中,这是我们想要实现的目标:

如果原始barIdNULL,我们会为value3分配一些默认值,例如0。如果barId不是NULL,我们会从原始value3表中复制Bar。我们如何实现这一目标?

我还注意到一个非常相似的问题:join two tables into one big table。 但是,我们无法使用union all,因为:

  

UNION中的每个SELECT语句必须具有相同的列数。 reference

1 个答案:

答案 0 :(得分:1)

是。 UNION不是你想要的。 UNION用于堆叠结果集。在您的情况下,您希望加入两个表:

SELECT foo.id, foo.value1, foo.value2, coalesce(bar.value3, 0) as value3
FROM foo 
    LEFT OUTER JOIN bar ON foo.barid = bar.id;

此处使用LEFT OUTER JOIN,以便我们从foo获取所有记录,并仅获取bar上与id匹配的记录。然后我们使用coalesce()函数说“如果bar.value3为空,则使用0作为值”。