2016-09-21 4 views
0

Итак, у меня есть таблица под названием «цена», в которой есть «dbName» столбцов, dbRetailer и dbPrice.Обновление информации о таблице таблицы базы данных

Я пытаюсь обновить «dbPrice» на 10%, но только для баз данных, которые были разработаны «Microsoft»

У меня также есть 2 других таблица под названием «DBSystem» и 'dbProducer ».

«DbName» является внешним ключом для «DB_NAME», который является первичным ключом в таблице «DBSystem»

Inside «DBSystem» есть внешний ключ называется «producerName», который указывает на первичный ключ 'manufacturer_Name' в 'dbProducer', который является именем производителя (например, Microsoft).

До сих пор я код:

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

Но это не имеет никакого способа реализации путь к информации запроса требует, что означает, что я получаю сообщение об ошибке, как

" имя_производства: недопустимый идентификатор ".

Любая помощь с этим была бы принята с благодарностью!

+1

mysql or oracle? Пожалуйста, отметьте только задействованные СУБД – Aleksej

+0

Извините, я считаю, СУБД 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); 

СКП:

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», но если значение необходимо отфильтровать уже в ПК , вы можете сделать это проще:

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

Смежные вопросы