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 子句中提及的列。