微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sql – 在Oracle Update Statement中使用子查询而不是表名

我需要编写一个使用多个表来确定要更新哪些行的更新语句,因为在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语句语法,我发现以下link,这表明您可以使用一个查询代替一个表名.

当我试图写这样的查询时,我得到一个“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

解决方法

一个选择:
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的声明的外键

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

原文地址:https://www.jb51.cc/mssql/82030.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐