举个例子,我们有两个表:
Foo {
Id;
value1;
value2;
barId;
}
Bar {
Id;
value3;
}
在以前版本的应用中,value3
是可选的;因此,我们把它放在一个单独的表中。现在我们决定将其作为必填字段并修改数据库模式,如下所示:
Foo {
Id;
value1;
value2;
value3;
}
在迁移过程中,这是我们想要实现的目标:
如果原始barId
为NULL
,我们会为value3
分配一些默认值,例如0
。如果barId
不是NULL
,我们会从原始value3
表中复制Bar
。我们如何实现这一目标?
我还注意到一个非常相似的问题:join two tables into one big table。
但是,我们无法使用union all
,因为:
UNION中的每个SELECT语句必须具有相同的列数。 reference
答案 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
作为值”。