我有一个名为 SCORPADData 的数据库,它有两个表:Parts 和 Failure_Rates。我试图获取 Parts 表中的 Reparable 列,并根据定罪率表中的值将其设置为 bool 值,该值介于 0 和 100.0 之间。报废率为 100.0 意味着该部件无法修复。
我这样做是因为我被要求获取一个数据库并使其能够被最初在一次性更新中从另一个数据库读取的软件读取。我尝试以两种不同的方式执行此操作:使用 Case 以及使用设置值为 false 的Where。声明如下。
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 这样的词并不能找到任何人。
最佳答案
我建议使用子查询,因为这适用于所有数据库。一个完整的例子:
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;
关于SQL 更新集与作用于其他表的Where,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9574300/