感谢您的回复。这是问题.... Oildatasetstatusid(5-11)被映射到labid = 4。 Labid = 4具有多个客户的输入数据,因此无法基于oildatasetstatusid执行更新。更新必须基于samplepointid。这就是使用3个表的原因。
我是SQL无知者之一,并被要求执行一项超出我理解范围的任务。我们的客户希望更改其现有的严重性级别,例如从低警告(severityid = 7)更改为低(severityid = 18)。严重性信息由第三方石油实验室输入数据库。我想使用来自三个不同表的信息生成一个列表,然后更改该列表上的严重性映射。我在下面提供了足够的信息吗?有人可以帮忙????
table: samplepoint
- samplepointid
table: oildataset
- oildatasetid
- oillabid (4=R&G)
- samplepointid
table: Oildatasetstatus
- Oildatasetid
- Oildatasetstatusid (5,6,7,8,9,10,11) needs to be changed to (16,17,18,19,20)
- 5=16
- 6=17
- 7,8,9=18
- 10=19
- 11=20
答案 0 :(得分:1)
我不知道你是否会做其他事情,但如果你只是想取代这些严重性,请这样做:
UPDATE Oildatasetstatus SET Oildatasetstatusid = 16 WHERE Oildatasetstatusid = 5;
UPDATE Oildatasetstatus SET Oildatasetstatusid = 17在哪里Oildatasetstatusid = 6;
UPDATE Oildatasetstatus SET Oildatasetstatusid = 18在哪里Oildatasetstatusid IN(7,8,9);
UPDATE Oildatasetstatus SET Oildatasetstatusid = 19 WHERE Oildatasetstatusid = 10;
UPDATE Oildatasetstatus SET Oildatasetstatusid = 11 WHERE Oildatasetstatusid = 20;
如果 Oildatasetid 是主键,那么应该这样做。
小心并备份数据。
Oildatasetstatus 与 oildataset 之间的联系是什么?
答案 1 :(得分:1)
如果我理解你的任务,这里的声明可能有所帮助。你没有说你正在使用什么牌子的数据库软件。
多表UPDATE
语法是非标准SQL,只有Microsoft SQL Server和MySQL支持。以下是MS SQL的一个示例(未经测试):
UPDATE Oildatasetstatus
SET Oildatasetstatusid =
CASE Oildatasetstatusid
WHEN 5 THEN 16
WHEN 6 THEN 17
WHEN 7 THEN 18
WHEN 8 THEN 18
WHEN 9 THEN 18
WHEN 10 THEN 19
WHEN 11 THEN 20
ELSE Oildatasetstatusid
END CASE
FROM Oildatasetstatus
JOIN Oildataset USING (Oildatasetid)
WHERE Oildataset.Oillabid = 4;
如果您对SQL没有信心,请首先在您的数据副本上运行它,并验证它是否按预期运行!
答案 2 :(得分:1)
重复重字节:小心!
这里一个方便的提示是在你知道它们会影响什么之前不要写任何UPDATE或DELETE语句。这相对简单,因为您可以使用相同的where子句构建SELECT语句。
例如:
UPDATE Oildatasetstatus SET Oildatasetstatusid=18
WHERE Oildatasetstatusid IN (7, 8, 9)
变为:
SELECT * FROM Oildatasetstatus
WHERE Oildatasetstatusid IN (7, 8, 9)
或者您可以使用注释进行操作,以便在执行时可以轻松将其转换为更新语句:
-- UPDATE Oildatasetstatus SET Oildatasetstatusid=18
SELECT * FROM
WHERE Oildatasetstatusid IN (7, 8, 9)
答案 3 :(得分:1)
我想使用来自三个不同表格的信息生成一个列表
您发布的架构在samplepoint表中没有实际信息,因此它实际上只是来自两个表的信息。基本上我猜你只想加入'oildataset'中的'oillabid'和'samplepointid'值到'oildatasetstatus'的每一行?
SELECT *
FROM oildatasetstatus
JOIN oildataset ON oildataset.oildatasetid=oildatasetstatus.oildatasetid
然后更改该列表上的严重性映射。
我猜你的意思是你希望你的查询具有不同的严重性,而不是实际更新你存储的'oildatasetstatus'表?如果是这样,您可以使用CASE运算符:
SELECT
oildataset.oildatasetid, oildataset.oillabid, oildataset.samplepointid,
CASE oildatasetstatus.oildatasetstatusid
WHEN 5 THEN 16
WHEN 6 THEN 17
WHEN 7 THEN 18
WHEN 8 THEN 18
WHEN 9 THEN 18
WHEN 10 THEN 19
WHEN 11 THEN 20
END AS newstatus
FROM oildatasetstatus
JOIN oildataset ON oildataset.oildatasetid=oildatasetstatus.oildatasetid
答案 4 :(得分:0)
update Oildatasetstatus
set Oildatasetstatusid = 16
where Oildatasetstatusid = 5
- 然后为每个其他状态ID运行类似的命令
如果您想在以后获得报告,则可以运行以下内容:
select s.samplepointid
, ods.oildatasetid
, ods.oillabid
, odss.oildatsetstatusid
from samplepoint s
, oildataset ods
, oildatasetstatus odss
where ods.samplepointid = s.samplepointid
and odss.oildatasetid = ods.oildatassetid
order by s.samplepointid