Обновление SQL установлено с Где действует на другую таблицу - PullRequest
2 голосов
/ 06 марта 2012

У меня есть база данных с именем SCORPADData и две таблицы: Parts и Failure_Rates. Я пытаюсь взять столбец Reparable в таблице Parts и установить его как логическое значение на основе значения в таблице коэффициентов осуждения, которое находится где-то между 0 и 100.0. Коэффициент осуждения 100,0 означает, что деталь не может быть отремонтирована.

Я делаю это, потому что меня попросили взять одну базу данных и сделать ее читаемой для программного обеспечения, которое первоначально считывало другую в обновлении. Я пытался сделать это двумя разными способами: используя Case и используя Where с установленным значением false. Заявления перечислены ниже.

UPDATE SCORPADData.Parts 
SET Reparable = CASE
    WHEN SCORPADData.Failure_Rates.Part_ID = SCORPADData.Parts.ID AND SCORPADData.Failure_Rates.Condemnation_Rate = 100.0 
        THEN 'TRUE' 
        ELSE 'FALSE' 
    END 
FROM SCORPADData.Parts , SCORPADData.Failure_Rates

Я получаю сообщение об ошибке: «Столбец SCORPADDATA.FAILURE_RATES.CONDEMNATION_RATE не найден».

UPDATE SCORPADDATA.PARTS 
SET REPARABLE = TRUE

UPDATE SCORPADDATA.PARTS 
SET REPARABLE = FALSE 
FROM SCORPADDATA.FAILURE_RATES 
WHERE SCORPADDATA.PARTS.ID = SCORPADDATA.FAILURE_RATES.PART_ID 
    AND SCORPADDATA.FAILURE_RATES.CONDEMNATION_RATE = 100.0

Я получаю здесь ошибку синтаксиса; мне не нравится мое размещение ОТ. Размещение его после WHERE также не работает, потому что он не находит столбец.

В обоих случаях я думаю, что FROM не работает, как я надеялся, потому что таблица FAILURE_RATES не используется в операторе UPDATE SET. Я работаю с базой данных H2 в приложении Java. Я новичок в SQL, поэтому приношу свои извинения, если это то, что я должен знать, но поиск в Google (или SO) таких слов, как WHERE и FROM, никого не находит.

Ответы [ 2 ]

4 голосов
/ 06 марта 2012

Я предлагаю использовать подзапрос, так как он работает во всех базах данных.Полный пример:

drop table Parts;
drop table Failure_Rates;
create table Parts(ID int, REPARABLE boolean);
create table Failure_Rates(PART_ID int, Condemnation_Rate double);

insert into Parts values(1, null), (2, null), (3, null);
insert into Failure_Rates values(1, 50), (2, 100);

update Parts p set Reparable = (select
  (case when Condemnation_Rate = 100 then true else false end)
  from Failure_Rates f where f.PART_ID = p.id)
where exists (select * from Failure_Rates f where f.PART_ID = p.id);

select * from Parts;
0 голосов
/ 06 марта 2012
UPDATE SCORPADDATA.PARTS 
SET REPARABLE = FALSE 
FROM SCORPADDATA.PARTS ,SCORPADDATA.FAILURE_RATES 
WHERE SCORPADDATA.PARTS.ID = SCORPADDATA.FAILURE_RATES.PART_ID 
    AND SCORPADDATA.FAILURE_RATES.CONDEMNATION_RATE = 100.0
...