postgreSQL更新"目标"表以使用"源"表实现"结果"表



有一个看起来像这样的表'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要求使用"源"表将"目标"表转换为"结果"表,该表看起来像这样:

结果
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  

但是,我不确定如何基于使用PostgreSQL的多个表的条件在SQL中完成此类更新。

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

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

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

(sqlfiddle远非您应该写DDL的模型 - 这是一个有用的调试工具,仅此而已)。

所以现在您可以玩一些。

在这一点上,我建议您查看UPDATE ... FROM语句,该语句使您可以更新加入。或者,您可以使用UPDATE中的子查询执行所需的逻辑。

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

合并数据

幸运的是,他们给您的结果表是简单的联接日期的结果。请注意,"源"中存在的行但不是"目标"中没有添加到"结果"

如果您应该将两者合并 Merge ,以便source中不存在target中不存在的条目完全添加到target中,这将成为所谓的UpSert。这是广泛写的。请参阅本文中包含的链接。很高兴您不必处理。

最新更新