【问题标题】:How to populate column data in one table based on an id match from another table (using the data from the matched table)如何根据来自另一个表的 id 匹配填充一个表中的列数据(使用匹配表中的数据)
【发布时间】:2016-11-02 03:46:33
【问题描述】:

在 Oracle 中,我有两个表。两者都填充了数据并有一个timestamp 列。

一个表的该列填充了数据,而另一个表没有。但是我需要根据另一列的匹配从表中获取数据到另一表的列中。

每个都有“代码”,因此一个表的时间戳只能放在代码匹配的另一个表的时间戳中。

我已经尝试过游标等,但似乎我错过了一些东西。

有什么建议吗?

【问题讨论】:

  • code 是源表中的主键还是唯一列?
  • 它不是主键,它可以为空,而且我很确定它不是唯一的
  • 那两个码匹配怎么办?
  • 将时间戳从一张表放入另一张表中匹配码的行
  • 对不起,我不清楚,我会再试一次。当源表中的两行匹配相同的代码时,你会怎么做?

标签: oracle plsql cursor


【解决方案1】:

听起来您想要一个相关的更新。这将使用sourceTable 中的timestamp_col 更新destinationTable 的每一行,其中code 列上有匹配项。

UPDATE destinationTable d
   SET timestamp_col = (SELECT s.timestamp_col
                          FROM sourceTable s 
                         WHERE s.code = d.code )
 WHERE EXISTS( SELECT 1
                 FROM sourceTable s
                WHERE s.code = d.code )

【讨论】:

  • 这很可能会失败,因为代码列可能包含重复项(请参阅问题的 cmets)。您可能需要 max(s.timestamp_col) 或子选择中的类似内容。
  • 这似乎是要走的路……但我们正在处理大约 3000 万行……所以我们要先做一些其他的事情来加速它……用这个记住数字...你还有什么建议吗?
  • @redBarron - 单个UPDATE 语句将是更新大量行的最有效方式。正如@Neil 和@a_horse_with_no_name 所指出的那样,如果可以有多个具有相同code 的行,则需要指定其他条件来确定源表中的哪一行用于更新目标中的任何特定行表(可能带有max(s.timestamp_col))。
  • 感谢 Neil 和 Justin...我在列上创建了索引,并使用 max() 运行了上面的代码.. 效果很好。
【解决方案2】:

为了完整起见,如果目的地有主键或唯一列,我想我会做这样的事情(未经测试):

UPDATE (
  SELECT d.primary_key AS pk, d.timestamp_col AS dest_col, MAX(s.timestamp_col) AS src_col
    FROM dest d
    JOIN src s ON d.code = s.code
    GROUP BY pk, dest_col
  ) j
  SET j.dest_col = j.src_col

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 2021-08-11
    • 2017-02-10
    • 2023-01-14
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    相关资源
    最近更新 更多