当前位置:  开发笔记 > 编程语言 > 正文

在Oracle Update语句中使用子查询而不是表名

如何解决《在OracleUpdate语句中使用子查询而不是表名》经验,为你挑选了2个好方法。

我需要编写一个更新语句,该语句使用多个表来确定要更新的行,因为在Oracle中,不允许多个表.以下查询将返回"ORA-00971:缺少SET关键字"错误

UPDATE
  TABLE1 a,
  TABLE2 b
SET
  a.COL1 = 'VALUE'
WHERE
  a.FK = b.PK
  AND b.COL2 IN ('SET OF VALUES')

在oracle上查找UPDATE语句语法,我找到了以下链接,它显示您可以使用子查询代替表名.

当我尝试写这样的查询时,我得到了一个"ORA-01779:无法修改映射到非密钥保留表的列"

UPDATE
  (
    SELECT
      a.COL1
    FROM
      TABLE1 a,
      TABLE2 b
    WHERE
      a.FK = b.PK
      AND b.COL2 IN ('SET OF VALUES')
  ) update_tbl
SET
  update_tbl.COL1 = 'VALUE'

我确实使用EXISTS语句重写了查询(如下所示)并且它工作正常,但仍然想知道如何完成.

UPDATE
  TABLE1 update_tbl
SET
  update_tbl.COL1 = 'VALUE'
WHERE
  EXISTS (
    SELECT
      1
    FROM
      TABLE1 a
      TABLE2 b
    WHERE
      a.FK = b.PK
      AND b.COL2 IN ('SET OF VALUES')
      AND update_tbl.PK = a.PK
  )

谢谢!-Nate



1> Tony Andrews..:

另外一个选项:

UPDATE TABLE1 a
SET a.COL1 = 'VALUE'
WHERE a.FK IN
( SELECT b.PK FROM TABLE2 b
  WHERE b.COL2 IN ('SET OF VALUES')
)

如果(a)视图包含TABLE1 的声明 PK,则第二个示例将起作用:

UPDATE
  (
    SELECT
      a.COL1, a.PKCOL
    FROM
      TABLE1 a,
      TABLE2 b
    WHERE
      a.FK = b.PK
      AND b.COL2 IN ('SET OF VALUES')
  ) update_tbl
SET
  update_tbl.COL1 = 'VALUE'

......和(b)TABLE1.FK是TABLE2 的声明外键

(通过声明我的意思是存在约束并启用).



2> Nick Pierpoi..:

我发现将SELECT语句转换为UPDATE的一种很好,快速,一致的方法是根据ROWID进行更新.

UPDATE
  TABLE1
SET
  COL1 = 'VALUE'
WHERE
  ROWID in
    (
    SELECT
      a.rowid
    FROM
      TABLE1 a,
      TABLE2 b
    WHERE
      a.FK = b.PK
      AND b.COL2 IN ('SET OF VALUES')
    )

因此,您的内部查询定义要更新的行.

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有