使用多个表中的数据提取列表的SQL语句

时间:2009-02-11 22:00:32

标签: sql

感谢您的回复。这是问题.... 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

5 个答案:

答案 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