【问题标题】:Update a table based on a temporary table in oracle根据oracle中的临时表更新表
【发布时间】:2015-10-24 23:04:47
【问题描述】:

我想根据临时表的值(来自 Tmp_Tbl 的nationalid)更新表的列(来自 Personal_info 的national_id)。

下面两个表使用 cid,user_id 相互具有 pk/fk 关系。

用户(cid,user_name)

个人信息(user_id,national_id)

临时表也使用唯一的用户名与用户表建立关系。

Tmp_Tbl(user_name,nationalid)

因为它是 oracle,我不想使用更新连接,也不想合并语法,因为我已经有了解决方案。我正在寻找一个简单的更新查询来使用。

【问题讨论】:

  • 不幸的是,加入是我可以看到你已经拥有的答案!
  • Oracle 不支持 UPDATE 语句中的联接
  • @彼得。 . . Oracle 支持子查询中的连接,它支持UPDATE 中的子查询。它不支持UPDATE 使用 JOIN;有细微的差别。

标签: sql oracle


【解决方案1】:

在 Oracle 中,您可以使用子查询来执行此操作,但您需要小心。您需要在setwhere 中使用类似的子查询:

UPDATE Personal p
   SET national_id = (SELECT t.nationalid
                      FROM tmp_tbl t JOIN
                           users u
                           ON t.user_name = u.user_name
                      WHERE u.cid = p.user_id
                     )
   WHERE EXISTS (SELECT 1
                 FROM tmp_tbl t JOIN
                      users u
                      ON t.user_name = u.user_name
                 WHERE u.cid = p.user_id
                );

如果您省略了WHERE 子句,您将删除不在临时表中的用户的national_id

这假设您只想更新现有用户的值。如果既要添加新用户又要插入值,那么代码就比较复杂了。

【讨论】:

  • tmp_tbl中没有user_id,这是重点...ON t.user_id = u.cid
  • @彼得。 . .我在喝咖啡前回答。有几个错误。
猜你喜欢
  • 1970-01-01
  • 2016-11-18
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多