oracle 获取'发现更新:预期:(SELECT..)编写“With CTE”语句时出错

guykilcj  于 2023-04-29  发布在  Oracle
关注(0)|答案(2)|浏览(126)

我得到以下错误,
错误'Found ' UPDATE ':需要:(SELECT -or-,.....循环或搜索)
...运行以下代码时:

WITH CTE AS (
   Select id, ROW_NUMBER() OVER (ORDER BY ID) + 99 AS New_id
From table_1
Where ID between 155662 AND 166046
)
UPDATE TABLE_1
SET ID =CTE.NEW_id
From CTE
WHERE TABLE_1.Id = CTE.id;

我需要这样做的原因是,通过rabbitmq,我不小心将数据发送到错误的表,其中包括自动生成的ID,但我现在想更新我错误添加的那些行的ID,以便与正确的表相对应,然后我将它们插入到正确的表中,然后从table_1中删除。我希望只对那些错误添加的行进行编号,以便与目标表中的编号相匹配。请注意,该表被设置为始终生成,为了进行更改,我将其更改为默认生成。
我尝试了这个代码,但一直得到这个错误。在尝试这个之前,我有一个稍微简单的代码,但后来得到了一个错误的东西做一个窗口,所以在线搜索,这是解决方案。
我在Oracle ToAD上运行这个
任何帮助非常感谢。

qvk1mo1f

qvk1mo1f1#

我使用MSSQL和MySQL,所以这是一个经过研究的答案。我相信在Oracle中,你可以在派生查询中引用outside tables。如果这是正确的,我认为这应该是可行的:

UPDATE TABLE_1 T1
SET    T1.ID = (
    SELECT T2.NEW_id
    FROM   CTE T2
    WHERE  T2.id = T1.id
)
rkue9o1l

rkue9o1l2#

只能对SELECT语句使用WITH。如果您需要一个派生视图来驱动更新,请使用MERGE命令:

MERGE INTO table_1
USING (
   Select id, ROW_NUMBER() OVER (ORDER BY ID) + 99 AS New_id
    From table_1
    Where ID between 155662 AND 166046
      ) src
ON (src.id = table_1.id)
WHEN MATCHED THEN UPDATE SET table_1.id = src.new_id

相关问题