如何使用其他表中的条件更新表

时间:2015-12-04 19:52:30

标签: sql oracle join sql-update

我有桌子"人"和桌子" Fisica"这是" Person"的延伸。两个表都与字段名称Id相关,我想根据包含两个表的条​​件更新表。 例如:

Tables:
Persona(Id, Name, Money)
Fisica(Id, LastName, Year)

使用数据:

Persona(1, X, 5)
Persona(2, A, 10)
Fisica(1, Y, 1990)
Fisica(2, B, 2000)

我想在Persona.Name =' X'中设置Persona.Name = some_Value,Fisica.LastName = other_Value和Fisica.Year = number,结果

Persona(1, some_Value, 5)
Persona(2, A, 10)
Fisica(1, other_Value, number)
Fisica(2, B, 2000)

我在Oracle工作

2 个答案:

答案 0 :(得分:0)

您无法使用一个语句更新两个表。所以你需要两个UPDATE语句。

所以你必须更新一个,然后另一个。问题是,首先是哪一个?

这并不重要,但如果您先更新Persona并更改名称,则在更新Fisica时必须使用新名称。像这样:

update Persona
set name = 'some_Value'
where name = 'current_Name'
;
update Fisica
set lastname = 'other_Value',
    year = number
where id = (
  select id
  from Persona
  where name = 'some_Value'
)
;

如果您先更新Fisica,则会同时使用旧的name值,如下所示:

update Fisica
set lastname = 'other_Value',
    year = number
where id = (
  select id
  from Persona
  where name = 'current_Value'
)
;
update Persona
set name = 'some_Value'
where name = 'current_Value'
;

注意number必须替换为实际的数值。

良好的编码实践是将两个语句放在同一个事务中,并且只有在它们都成功时才提交。

答案 1 :(得分:0)

虽然Oracle没有提供像mysql这样的功能,我们可以像这样编写查询:

Update table1 t1, table2 t2 set t2.field2="ABC" where t1.id=t2.id

但您可以在Oracle for Views中使用单个查询更新多个表。

因此,为上述两个表Persona, Fisica创建视图,并按如下方式编写查询:

 CREATE OR REPLACE FORCE VIEW  "Persona_Fisica" ("PersonaID", "Name", "Money", "FisicaID", "Lastname", "Year") AS 
      select P.Id as PersonaID,
        Name as Name,
        Money as Money,
        F.Id as FisicaID,
        LastName as Lastname,
        year as Year
     from Persona P,
        Fisica F 
     where P.ID=F.ID
/
Update Persona_Fisica set Name=some_Value, LastName=other_Value,Year=number were Name='X',