Oracle 从多个子查询更新
Oracle update from multiple subqueries
我想在 oracle 中执行以下操作:
update tableA tA
set tA.value = (
select tB.value
from tableB tB
inner join tableC tC
on tB.value = tC.value
)
它给了我 ORA-01427。我需要如何将查询更改为 运行 呢?如果我添加 "and rownum=1" 我可以 运行 查询但是我将在所有行中得到相同的结果。
你应该在 tableA 和 tableB/tableC 之间建立关系,结果正好给你一行。
假设在名为 "id".
的列上,tableA 和 tableB 之间存在关系
update tableA tA
set tA.value = (
select tB.value
from tableB tB
inner join tableC tC
on tB.value = tC.value
where tB.id = tA.id
)
ORA-01427
您的 UPDATE 语句的问题是子查询返回多行,但是,set 子句 需要单个排。使它工作的唯一方法是在子查询的结果集和要更新的 table 之间有一个连接候选者。基本上,您需要将其设为 相关子查询 .
我更喜欢使用 MERGE 语句,因为它冗长且易于解释。
MERGE INTO tableA A
USING (SELECT tB.value value,
tB.join_candidate id
FROM tableB tB
INNER JOIN tableC tC
ON tB.VALUE = tC.VALUE
) b
ON(b.ID = A.ID)
WHEN MATCHED THEN
UPDATE SET a.value = b.value;
请记住,您不能更新您在 ON
子句中提及的列。
我想在 oracle 中执行以下操作:
update tableA tA
set tA.value = (
select tB.value
from tableB tB
inner join tableC tC
on tB.value = tC.value
)
它给了我 ORA-01427。我需要如何将查询更改为 运行 呢?如果我添加 "and rownum=1" 我可以 运行 查询但是我将在所有行中得到相同的结果。
你应该在 tableA 和 tableB/tableC 之间建立关系,结果正好给你一行。 假设在名为 "id".
的列上,tableA 和 tableB 之间存在关系update tableA tA
set tA.value = (
select tB.value
from tableB tB
inner join tableC tC
on tB.value = tC.value
where tB.id = tA.id
)
ORA-01427
您的 UPDATE 语句的问题是子查询返回多行,但是,set 子句 需要单个排。使它工作的唯一方法是在子查询的结果集和要更新的 table 之间有一个连接候选者。基本上,您需要将其设为 相关子查询 .
我更喜欢使用 MERGE 语句,因为它冗长且易于解释。
MERGE INTO tableA A
USING (SELECT tB.value value,
tB.join_candidate id
FROM tableB tB
INNER JOIN tableC tC
ON tB.VALUE = tC.VALUE
) b
ON(b.ID = A.ID)
WHEN MATCHED THEN
UPDATE SET a.value = b.value;
请记住,您不能更新您在 ON
子句中提及的列。