我在Oracle数据库中有两个表,分别是位置和国家/地区名称。 位置表包含名称为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:无效字符)。
请帮助我解决此问题。
答案 0 :(得分:1)
该错误,ORA-00911:无效字符与您的更新语句无关,可能来自您的PL / SQL的另一部分?
您的update语句实际上存在的问题是,您不能通过内联视图更新多个表。因此,如果在l
子句中删除别名set
并运行该语句,则应该得到ORA-01776:无法通过联接视图修改多个基表
不过,您可能可以将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
);
答案 1 :(得分:0)
尝试一下:
UPDATE hr.locations l
set l.street_address = '147 Spadina Ave',
l.postal_code = '122000215',
l.city = 'Toronto',
l.state_province = 'Ontario',
l.country_name = 'US'
WHERE l.location_id = 1200
AND EXISTS( SELECT '1'
FROM hr.countries c
WHERE l.country_id = c.country_id);