【问题标题】:Oracle update via join on text values for csvOracle 通过加入 csv 的文本值更新
【发布时间】:2016-10-25 14:02:19
【问题描述】:

一些背景知识 - 我有一个导出的 CSV 数据集,它将被导入/迁移到新系统中。我在这个数据集中没有识别 ID,因为在新系统中不需要它,但我现在需要在这个 CSV 中添加一些额外的数据。

我已将 CSV 导入 Oracle 表并创建了 2 个新列 - FieldLabelEDRN 和 ELEMENTID。我想用原始表中的相关数据更新这 2 列,所以我尝试了以下操作

UPDATE EDRN_NEW.DATADIC
SET FIELDLABELEDRN =
  (SELECT short_name
  FROM edrn.md$$_all_data_elements
  WHERE active_yn = 'YES'
  ORDER BY short_name
  ),
SET ELEMENTID =
  (SELECT element_id
  FROM edrn.md$$_all_data_elements
  WHERE active_yn = 'YES'
  ORDER BY short_name
  )

这会产生 ora-00907 错误,我知道这是非常基本的。我正在努力想一种方法来获得我需要的价值。我还尝试在 short_name = 字段标签上将 2 个表连接在一起,以仅拉入 element_id,因为这是我真正需要的,但我不太熟悉不能在 Oracle 的 UPDATE 中使用 JOIN

任何意见/建议将不胜感激

【问题讨论】:

  • 您需要一些方法将新值与它们进入的行进行匹配。
  • 除了@GordonLinoff 注释,你的语法不正确,SET 应该只用一次。
  • 不相关,但是,您可以通过仅使用单个子选择 set (FIELDLABELEDRN, ELEMENTID) = (select short_name, element_id from ...) 来提高性能 - 但是子选择中的 order by 是无用的
  • 抱歉,我现在意识到我的语法不正确。我会试试子选择集,谢谢。

标签: sql oracle csv join


【解决方案1】:

Oracle 提供了一种用于更新多列的快捷方式。但是,您需要某种方法将临时表中的行与现有表匹配。

语法如下:

UPDATE EDRN_NEW.DATADIC dd
    SET (FIELDLABELEDRN, ELEMENTID) =
         (SELECT short_name, element_id
          FROM edrn.md$$_all_data_elements ade
          WHERE active_yn = 'YES' AND
                ade.?? = dd.??
         );

但是你需要某种方式来匹配行,所以你需要在ade.?? = dd.??中填写详细信息。

您也可能将UPDATEINSERT 混淆了。你只是想要这个吗?

INSERT INTO EDRN_NEW.DATADIC(FIELDLABELEDRN, ELEMENTID)
      SELECT short_name, element_id
      FROM edrn.md$$_all_data_elements ade
      WHERE active_yn = 'YES' ;

【讨论】:

  • 一直在学习新东西。。不知道这个方法,+1。
  • 我希望能够在 short_name = field_label 上进行匹配,但由于“SQL 错误:ORA-01427:单行子查询返回多于一行”,我无法做到这一点
  • 不过,我可以使用插入并将记录匹配到 excel 中,这样对我有用,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 2019-07-21
相关资源
最近更新 更多