Oracle 使用单个查询更新和更改两个表中的少量列记录

Posted

技术标签:

【中文标题】Oracle 使用单个查询更新和更改两个表中的少量列记录【英文标题】:Oracle update and change few columns records in two tables with a single query 【发布时间】:2018-11-09 21:53:45 【问题描述】:

我在 My Oracle 数据库中有两个表,其中包含位置和国家/地区的名称。 Locations 表包含名称为 location_id(fk)、street_address、state_province 和 country_id 的列。国家表具有名称为 country_name、country_id、location_id(fk) 的列。 我想在单个查询中更新位置和国家表的一些列。 我用下面的查询做到了,但它不起作用。

update (select l.street_address, l.postal_code, l.city, l.state_province, c.country_name 
 from hr.countries c, hr.locations l where l.country_id = c.country_id ) 
 set l.street_address = '147 Spadina Ave',
       l.postal_code = '122000215',
       l.city = 'Toronto',
       l.state_province = 'Ontario',
       c.country_name = 'US'
 where l.location_id = 1200;

但我遇到了来自 PL/SQL 的错误(ORA-00911:无效字符)。

请帮我解决这个问题。

【问题讨论】:

update (select ... )is a valid Oracle statement@Gordon。在同一个语句中更新两个表是不行的。 【参考方案1】:

那个错误,ORA-00911:无效字符与您的更新语句无关,可能来自您的 PL/SQL 的另一部分?

您的更新语句实际上有问题的是您不能通过内联视图更新多个表。因此,如果您删除 set 子句中的别名 l 并运行该语句,您应该得到 ORA-01776:cannot modify more one base table through a join view

但是,您可以使用 INSTEAD OF TRIGGERview 来完成此操作。

在您的情况下,由于您正在根据给定的主键 (location_id = 1200) 更新表,因此运行这两个简单的更新应该没问题。不需要连接

UPDATE hr.locations
SET street_address = '147 Spadina Ave',
    postal_code = '122000215',
    city = 'Toronto',
    state_province = 'Ontario'
WHERE location_id = 1200;


UPDATE hr.countries
SET country_name = 'US' -- Toronto in United states, how did that happen?
WHERE country_id IN ( SELECT country_id
                       FROM hr.locations
                       WHERE location_id = 1200
                     );

【讨论】:

以上是关于Oracle 使用单个查询更新和更改两个表中的少量列记录的主要内容,如果未能解决你的问题,请参考以下文章

如何在oracle中将两个更新查询合并为单个更新查询?

更新 MySQL 表中的排名

oracle 如何根据一个表中记录的变动更新另外一个表中相应的字段

更新查询以根据另一表中的值更改一个表中列的现有值

在更新触发器之前或之后更改同一表中的值(oracle)

更新查询以根据不同表中的值更改一个表中列的现有值