【问题标题】:Getting error when doing an update query using joins [duplicate]使用连接进行更新查询时出错 [重复]
【发布时间】:2022-01-03 15:01:43
【问题描述】:
UPDATE A
SET foo = 'bar',
car = 'bmw'
FROM TableA A
JOIN TableB B
    ON A.col1 = B.colx
    AND A.STATUS = B.STATUS
WHERE A.nbr = '1234'
      and A.STATUS IN (K,Y)
      and A.FILE_TYPE = 'R'

我正在尝试使用上面的更新功能,但是当我尝试运行它时,我不断收到错误,它没有正确结束。谁能告诉我语法错误在哪里?

.

【问题讨论】:

  • 如果您有多个字段要更新,它们应该用逗号分隔。
  • 做了但仍然返回一个错误,它没有正确结束
  • postgresql 还是 mysql?这有点傻,但更新语句的语法在每个 RDBMS 中并不总是相同。
  • 更新语句中表 TableB 的用途是什么?听起来没用……可以简化如下:UPDATE TableA A SET foo = 'bar', car = 'bmw' WHERE A.nbr = '1234' and A.STATUS IN (K,Y) and A.FILE_TYPE = 'R'
  • STATUS IN (K,Y) 是一个可能的错字 应该是'K','Y'??

标签: sql oracle join sql-update


【解决方案1】:

在 Oracle 数据库中,当从另一个表更新一个表时,使用MERGE 语句通常更容易。

MERGE INTO TableA A
USING TableB B ON (
      A.col1 = B.colx
  AND A.STATUS = B.STATUS
  AND A.nbr = 1234
  AND A.STATUS IN (K,Y)
  AND A.FILE_TYPE = 'R'
)
WHEN MATCHED THEN UPDATE 
 SET foo = 'bar'
   , car = 'bmw';

【讨论】:

  • 大声笑,使用合并并不过分。它是标准 SQL,可能在不同的 RDBMS 中更加标准化,因为它后来被添加到标准中。在没有插入的情况下使用它是完全可以的。当然,通常您会看到使用源数据中的值更新目标表,但 Tim 可能有理由使用固定值更新它。
【解决方案2】:

在 Oracle 中,您不能 update 进行连接查询。您只能更新一个表(在某些情况下是 view子查询)。

幸运的是,您可以通过在 where 子句中传递条件来简单地重写您的 update 而无需加入。

update  TableA a
set foo = 'bar',
car = 'bmw'
WHERE a.nbr = '1234'
and a.STATUS IN ('K','Y')
and a.FILE_TYPE = 'R'
and (col1, status) in (select colx,status from tableB);

这是针对您所描述的问题的最简单解决方案。

注意如果你真的需要一个加入,例如如果您需要用tableB 的列更新tableA 的列,例如

UPDATE A
SET a.foo = b.foo,
a.car = b.car
....

您可以在 Oracle 中使用updatable join view,如下所示

update (
select a.*, b.foo new_foo, b.car new_car
FROM TableA A
JOIN TableB B
    ON A.col1 = B.colx
    AND A.STATUS = B.STATUS
WHERE A.nbr = '1234'
      and A.STATUS IN ('K','Y')
      and A.FILE_TYPE = 'R'
)
set foo = new_foo,
car = new_car

请注意,连接查询用括号括起来以获得正确的语法。

另请注意,tableB 必须在列colx,status 上具有主键(或唯一索引)才能进行更新。否则你会得到异常ORA-01779: cannot modify a column which maps to a non key-preserved table

【讨论】:

    猜你喜欢
    • 2022-06-22
    • 2023-04-10
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2014-01-24
    • 1970-01-01
    • 2018-03-31
    相关资源
    最近更新 更多