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

前端之家收集整理的这篇文章主要介绍了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的声明的外键

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

猜你在找的MsSQL相关文章