【问题标题】:SQL update 'target' table to achieve 'result' table using 'source' tableSQL 更新 'target' 表以使用 'source' 表实现 'result' 表
【发布时间】:2014-02-11 20:29:43
【问题描述】:

有一个表“目标”如下所示:

身份证号
1个
2个
3

5A
8个
9

还有一个看起来像这样的“源”表
身份证号
1
2乙

4 乙

8 乙
9乙

directioins 要求使用“源”表将“目标”表转换为“结果”表,如下所示:

结果
身份证号
1
2 乙
3

5A
8 乙
9乙

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

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

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

【问题讨论】:

    标签: sql postgresql sql-update conditional


    【解决方案1】:

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

    第一步是将这些变成您可以实际使用的表格。 http://sqlfiddle.com 提供了一个方便的工具,具有“文本到表格”功能。由于输入的格式不可靠,我们必须在它起作用之前进行一些修复(假设空列为空,而不是空字符串;修复空白错误),但随后我们得到:

    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 中的条目添加到target,这将成为所谓的 upsert .这已经被广泛地写了; see links included in this post。很高兴您不必处理这些问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 1970-01-01
      相关资源
      最近更新 更多