2009-02-11 168 views
1

感謝您的迴應。這是問題.... Oildatasetstatusid(5-11)映射到labid = 4。 Labid = 4具有多個客戶的輸入數據,因此無法根據oildatasetstatusid執行更新。更新必須基於samplepointid。這就是爲什麼使用3個表格的原因。SQL語句使用多個表中的數據抽取列表

我是SQL無知的人之一,並且被要求執行一個超出我理解範圍的任務。我們的客戶想要改變他們現有的嚴重程度,例如從低警告(嚴重性= 7)變爲低(嚴重性= 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 

回答

1

我想使用informati生成一個列表從三個不同的表上開始

您發佈的模式在樣本點表中沒有實際的信息,所以它實際上只是來自兩個表的信息。本質上,我猜你只是想將'oillabid'和'samplepointid'值從'oildataset'加入'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 
0
update Oildatasetstatus 
set Oildatasetstatusid = 16 
where Oildatasetstatusid = 5 

- 然後其他每個狀態的IDS運行的類似命令

如果你想以後得到的報告,你會運行是這樣的:

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 
1

我不知道你是否會做其他任何事情,但如果你只是想取代那些嚴重性,請這樣做:

UPDATE O ildatasetstatus SET Oildatasetstatusid = 16 WHERE Oildatasetstatusid = 5;

UPDATE Oildatasetstatus SET Oildatasetstatusid = 17 WHERE Oildatasetstatusid = 6;

更新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是比這應該做的主鍵。

小心並對數據進行備份。

Oildatasetstatusoildataset是什麼關係?

+0

感謝您的迴應。這是問題.... Oildatasetstatusid(5-11)映射到labid = 4。 Labid = 4具有多個客戶的輸入數據,因此無法根據oildatasetstatusid執行更新。更新必須基於samplepointid。這就是爲什麼使用3個表格的原因。 – 2009-02-11 22:26:32

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,您的數據第一副本運行它,並驗證它的工作原理,你指望它!

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) 
相關問題