更新数据库表信息问题

时间:2016-09-21 07:35:16

标签: sql oracle

所以我有一个名为' price '的表,其中包含'dbName',dbRetailer'和'dbPrice'列。

我正在尝试将'dbPrice'更新10%,但仅限于由'Microsoft'开发的数据库

我还有另外两个名为“ dbSystem ”和“ dbProducer ”的表。

'dbName'是'db_Name'的外键,它是表' dbSystem '中的主键

在' dbSystem '里面有一个名为'producerName'的外键,它指向' dbProducer '中的主键'producer_Name',它是生成者名称(例如微软)。

所以我的问题是如何创建只更新“Microsoft”开发的数据库的更新查询?

到目前为止,我有代码:

update price set dbPrice = dbPrice * 1.1 where producer_Name = 'Microsoft';

但是这无法实现查询所需信息的路径,这意味着我得到的错误就像

  

“producer_Name:无效的标识符”。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

如果我理解得很好,您可能需要MERGE

设置:

create table price (dbName varchar2(100), dbRetailer varchar2(100), dbPrice number);
create table dbSystem (dbName varchar2(100), producer_Name varchar2(100));
create table dbProducer ( producer_Name varchar2(100));
insert into dbProducer values ('Microsoft');
insert into dbProducer values ('Other');
insert into dbSystem   values ('Microsoft Product 1', 'Microsoft');
insert into dbSystem   values ('Microsoft Product 2', 'Microsoft');
insert into dbSystem   values ('Another Product',     'Other');
insert into price      values ('Microsoft Product 1', 'Retailer', 100);
insert into price      values ('Microsoft Product 2', 'Retailer', 200);
insert into price      values ('Another Product',     'Retailer', 50);

sql:

merge into price P
using (
        select *
        from dbSystem
             inner join dbProducer using(producer_name)
        where producer_name = 'Microsoft'
      ) M
on (M.dbName = P.dbName)
when matched then
update
set dbPrice = dbPrice * 1.1

在这里,我使用dbProducer将过滤器应用于' Microsoft',但如果您需要过滤的值已经在PK中,则可以使其更简单:

merge into price P
using (
        select *
        from dbSystem
        where producer_name = 'Microsoft'
      ) M
on (M.dbName = P.dbName)
when matched then
update
set dbPrice = dbPrice * 1.1

答案 1 :(得分:0)

 update price 
 set dbPrice = dbPrice * 1.1 
 where dbName in ( select dbName 
                   from dbSystem 
                   where producer_Name = 'Microsoft'
                 )
;