加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 16:37:36 所属栏目:MsSql教程 来源:网络整理
导读:我需要编写一个使用多个表来确定要更新哪些行的更新语句,因为在Oracle中,不允许有多个表.以下查询将返回“ORA-00971:缺少SET关键字”错误 UPDATE TABLE1 a,TABLE2 bSET a.COL1 = 'VALUE'WHERE a.FK = b.PK AND b.COL2 IN ('SET OF VALUES') 查看oracle上的UP
我需要编写一个使用多个表来确定要更新哪些行的更新语句,因为在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的声明的外键

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读