有一个表'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的多个表的条件来完成这种更新。
答案 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”
如果您应该合并两者,那么source
中target
中根本不存在的条目会添加到target
,这就变成了所谓的upsert。这已经被广泛地写了; see links included in this post。很高兴你没有必要处理它。