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 TRIGGER
和 view
来完成此操作。
在您的情况下,由于您正在根据给定的主键 (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 使用单个查询更新和更改两个表中的少量列记录的主要内容,如果未能解决你的问题,请参考以下文章