【问题标题】:Updating database table information issue更新数据库表信息问题
【发布时间】:2017-01-29 07:55:20
【问题描述】:

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

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

我还有另外 2 个名为“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:无效标识符”。

对此的任何帮助将不胜感激!

【问题讨论】:

  • mysql 还是 oracle?请仅标记涉及的 DBMS
  • 对不起,我相信 DBMS 是 Oracle。
  • 你的列名是大写还是小写? stackoverflow.com/questions/7425153/…
  • 是的,但我认为这不是问题所在,因为除了这个更新语句之外,我的其余代码都可以正常工作。

标签: sql oracle


【解决方案1】:

如果我理解得很好,您可能需要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

【讨论】:

  • 所以基本上我必须创建一个全新的表,以便可以从一个位置访问信息?
  • 我只是添加了脚本来创建一个新表以在我的系统上对其进行测试。该查询将适用于您的表。如果您有小写名称,只需编辑我的查询添加双引号并用正确的大小写写入表和列的名称
【解决方案2】:
 update price 
 set dbPrice = dbPrice * 1.1 
 where dbName in ( select dbName 
                   from dbSystem 
                   where producer_Name = 'Microsoft'
                 )
;

【讨论】:

  • 两个“dbName”都是你的例子吗?其中一个是否应该是“db_Name”?我试过你的代码,它没有抛出任何错误,但它也没有更新数据。
  • 正确!但我说的对,“dbName”之一可能是错误的。括号内的“dbName”应该是“db_Name”,因为这是对表“dbSystem”的主键引用。但那个错误不是你的错,所有的名字都太相似了,我自己都糊涂了。再次感谢!
猜你喜欢
  • 2021-07-07
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2011-12-03
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多