如何更新 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 有效
您第一次尝试更新会成功,您只是使用了错误的别名。您使用的是 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;
?
我有一个 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 有效
您第一次尝试更新会成功,您只是使用了错误的别名。您使用的是 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;
?