2016-09-21 72 views
0

因此,我有一個名爲'價格'的表,它具有列'dbName',dbRetailer'和'dbPrice'。正在更新數據庫表信息問題

我試圖通過10%,更新「dbPrice」,但僅限於通過「微軟」

我也有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:無效標識符「。

任何幫助,這將不勝感激!

+1

mysql或oracle?請僅標記涉及的DBMS – Aleksej

+0

對不起,我相信DBMS是Oracle。 – Nick

+0

您的列名是大寫還是小寫? http://stackoverflow.com/questions/7425153/reason-why-oracle-is-case-sensitive – Rene

回答

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

「dbName」是您的示例正確嗎?他們中的一個是否應該成爲「db_Name」?我試過你的代碼,它沒有拋出任何錯誤,但它也沒有更新數據。 – Nick

+0

這是正確的!但我正確地說,其中一個「dbName」可能是錯誤的。括號內的「dbName」被認爲是「db_Name」,因爲它是表「dbSystem」的主鍵引用。 但這個錯誤並不是你的錯,所有的名字都非常相似,我迷惑了自己。再次感謝! – Nick

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申請上「微軟」過濾器,但如果你需要過濾的價值已經在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 
+0

所以基本上我必須創建一個全新的表,以便信息可以從一個位置訪問? – Nick

+0

我簡單地添加了腳本來創建一個新表來在我的系統上測試它。該查詢將與您的表一起工作。如果您有小寫字母名稱,只需編輯我的查詢並添加雙引號,並使用正確的大寫字母寫入表和列的名稱 – Aleksej