SQL更新'target'表使用'source'表实现'result'表

时间:2014-01-22 00:17:59

标签: sql postgresql sql-update conditional

有一个表'target'如下所示:

id val
1 A
2 A
3

5 A
8 A
9

还有一个'源'表,看起来像这样 id val
1
2 B

4 B

8 B
9 B

directioins要求使用'source'表将'target'表转换为'result'表,如下所示:

结果
id val
1
2 B
3

5 A
8 B
9 B

我理解问题所在的逻辑,因为我相信我需要做的就是基本上说

IF target.id = source.id  
SET target.val = source.val  
ELSE target.val = target.val  

但是,我不完全确定如何在SQL中基于使用postgresql的多个表的条件来完成这种更新。

1 个答案:

答案 0 :(得分:1)

这看起来像是作业,所以我不会给出完整的答案。

第一步是将这些变成你可以实际使用的表格。 http://sqlfiddle.com提供了一个方便的工具,其“文本到表格”功能。由于输入的狡猾格式化,我们必须在它工作之前做一些修正(假设空cols为null,不是空字符串;修复空白错误)但是我们得到:

http://sqlfiddle.com/#!15/4a046

(SQLfiddle远不是你应该如何编写DDL的模型 - 它是一个有用的调试工具,就是这样)。

所以现在你可以玩一些东西了。

此时,我建议查看the UPDATE ... FROM statement,它可以让您更新联接。或者,您可以使用UPDATE中的子查询来执行所需的逻辑。

UPDATE target
SET val = source.val
FROM /* you get to fill this in */
WHERE /* you get to fill this in */

合并数据

幸运的是,他们给你的结果表是一个简单的连接更新的结果。请注意,“source”但不是“target”中的行尚未添加到“result”

如果您应该合并两者,那么sourcetarget中根本不存在的条目会添加到target,这就变成了所谓的upsert。这已经被广泛地写了; see links included in this post。很高兴你没有必要处理它。