如何更新 table 表单本身?

How to update a table form itself?

我有一个 table A。我想将一个字段递增 1。

CREATE TABLE A(
a1 integer,
a2 integer
)

INSERT INTO A (a1, a2)
   VALUES (1, 1); 


update A ANEW set 
(a1,a2)=(select a1,a2+1 from A AOLD where ANEW.a1=AOWL.a1)

ORA-00904: "AOWL"."A1": invalid identifier

FORALL i IN INDICES of (select a1, a2 from A ) t
    update INTO A 
          VALUES (t(i).a1,t(i).a2+1)
          where A.a1=t(i).a1;

ORA-00900: invalid SQL statement

MERGE into A AOLD
using (select a1,a2+1 from A) ANEW on (ANEW.a1=aOLD.a1)
        WHEN MATCHED
        THEN
            UPDATE SET
                ANEW.a1=AOLD.a1,
                ANEw.a2=AOLD.a2+1;

ORA-00904: "ANEW"."A1": invalid identifier.

此解决方案的

None 有效

code

您第一次尝试更新会成功,您只是使用了错误的别名。您使用的是 AOWL 而不是 AOLD。

UPDATE A ANEW
   SET (a1, a2) =
           (SELECT a1, a2 + 1
              FROM A AOLD
             WHERE ANEW.a1 = AOLD.a1);

但是不需要子查询就可以更简化更新

UPDATE a
   SET a2 = a2 + 1;

您在合并语句中混淆了语法。试试这个(请注意,我已将别名重新标记为“tgt”和“src”,以帮助您了解列的来源):

MERGE into A tgt
using (select a1,
              a2+1 a2_new from A) src
  on (tgt.a1=src.a1)
WHEN MATCHED THEN
UPDATE SET tgt.a2=src.a2_new;

请注意,我为您的源查询中的 a2 列指定了一个别名;您现在可以在更新部分使用它。此外,由于您无法更新处于连接条件的列,因此我已将其从更新部分中删除。

但是,如果您只想将列的值加 1,为什么不直接:

update a
set    a2 = a2 + 1;

?

db<>fiddle