SQL 更新集与作用于其他表的Where

标签 sql h2

我有一个名为 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/

相关文章:

java - Spring Quartz 始终使用 RAM Job Store

timestamp - 将unix时间戳转换为H2时间戳

sql - 避免多对多表中的可空外键

c# - 在 visual studio 中查看 .mdf 文件的数据

mysql - 将多个 SQL 语句组合成一个

c++ - MFC/Sql 相同情况下的不同异常

javascript - 如何在 Javascript 中将 CLOB 转换为字符串

java - 如何使用具有自定义文件扩展名的 H2 数据库?

java - 创建文件 null.lobs.db 时出错 [90062-101]

sql - 将 sql 查询导出到 csv 的 Perl 脚本