2016-09-21 11 views
0

私は '価格'というテーブルに 'dbName'、dbRetailer 'と' dbPrice 'という列があります。データベーステーブル情報の更新の問題

私は10%で「dbPrice」を更新しようとしていますが、唯一の「Microsoftの

によって開発されたデータベースのための私も「dbSystem」と 'dbProducerと呼ばれる2他のテーブルを持っています'

「dbnameは」「dbSystem

インサイド「dbSystem」テーブルの主キーは「DB_NAME」の外部キーで指す「producerName」と呼ばれる外部キーがありますプロデューサ名(例:Microsoft)である 'dbProducer'の主キー 'producer_Name'。

したがって私の質問は、「Microsoft」によって開発されたデータベースのみを更新する更新クエリを作成する方法ですか?

これまでのところ、私はコードがあります:

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

をしかし、これはクエリは「私は

のようなエラーが出る意味し、必要な情報へのパスを実装する方法がありませんproducer_Name:無効な識別子 "です。

これについてのお手伝いをさせていただきます。

+1

mysql or 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」はどちらも正しいですか?そのうちの1つは「db_Name」であると思われますか?私はあなたのコードを試しました、それはエラーをスローしなかったが、それもデータを更新しませんでした。 – Nick

+0

それは正しかった!しかし、私は "dbName"の1つが間違っているかもしれないと言っていました。かっこ内の "dbName"は、 "dbSName"というテーブルへの主キー参照であるため、代わりに "db_Name"であると考えられます。 しかし、その間違いはあなたのせいではなかった、すべての名前は私が自分自身を混乱させるほど似ている。再度、感謝します! – 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:ここで私は、「マイクロソフトにフィルタを適用するdbProducerを使用しますが、

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 

あなたはフィルタリングする必要がある値は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

基本的には、情報が1か所からアクセスできるように、全く新しいテーブルを作成する必要がありますか? – Nick

+0

スクリプトを追加して、自分のシステムでテストするための新しいテーブルを作成するだけです。クエリはテーブルで動作します。小文字の名前がある場合は、二重引用符を追加して大文字と小文字の区別を入れてクエリを編集してください。 – Aleksej

関連する問題