SQL Update设置,其中Where在其他表上执行

时间:2012-03-05 21:31:28

标签: sql h2

我有一个名为SCORPADData的数据库,它有两个表,Parts和Failure_Rates。我正在尝试在Parts表中使用Reparable列,并根据谴责率表中的值将其设置为布尔值,该值介于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

我在这里遇到的错误是语法错误;它不喜欢我的FROM位置。将它放在WHERE之后也不起作用,因为它找不到列。

在这两种情况下,我都认为FROM不能正常工作,因为在UPDATE SET语句中没有使用FAILURE_RATES表。我正在使用Java应用程序中的H2数据库。我是SQL的新手,所以我很抱歉,如果这是我应该知道的事情,但在Google(或SO)上搜索像WHERE和FROM这样的词语并不能让任何人在任何地方。

2 个答案:

答案 0 :(得分:4)

我建议使用子查询,因为这适用于所有数据库。一个完整的例子:

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;

答案 1 :(得分:-2)

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