来自多个子查询的Oracle更新

时间:2015-11-04 06:53:06

标签: sql oracle sql-update subquery

我想在oracle中执行以下操作:

update tableA tA 
set tA.value = (
  select tB.value 
  from tableB tB 
  inner join tableC tC 
  on tB.value = tC.value
)

它给了我ORA-01427。我怎么需要更改查询来运行它?如果我添加"和rownum = 1"我可以运行查询,但我将在所有行中得到相同的结果。

2 个答案:

答案 0 :(得分:0)

你应该在tableA和tableB / tableC之间建立一个关系,结果只能给你一行。 假设,tableA和tableB之间存在一个名为“id”的列的关系。

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
)

答案 1 :(得分:0)

  

ORA-01427

UPDATE 语句的问题是子查询返回多行,但 set子句需要一行。使其工作的唯一方法是在子查询的结果集和要更新的表之间建立连接候选。基本上,您需要将其设为相关的子查询

我更喜欢使用 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子句中更新您要提及的列。