Oracle通过单个查询更新和更改两个表中的几列记录

时间:2018-11-09 21:53:46

标签: sql oracle plsql

我在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:无效字符)。

请帮助我解决此问题。

2 个答案:

答案 0 :(得分:1)

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

您的update语句实际上存在的问题是,您不能通过内联视图更新多个表。因此,如果在l子句中删除别名set并运行该语句,则应该得到ORA-01776:无法通过联接视图修改多个基表

不过,您可能可以将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
                     );

答案 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);