2009-02-18 118 views
0

我試過下面的陳述,它沒有起作用。查詢分析器返回一個「(0)行受影響」。好消息......它沒有炸燬......壞消息......我不知道這個聲明有什麼問題。通過從多個表格中提取信息更新表格

我想我正在使用SQL Server 2000.我還沒有嘗試過我的演示數據庫中的語句。第二種說法是將舊的oillab(oillabid = 4)更新爲新的oillab(oillabid = 9)。 oillabid映射到oillabstatusid的oillabstatus表中正在改變的oillabstatusid。

我想通過customerid更新oildatasetstatus表中的oildatasetstatusid。爲了獲得customerid,我需要從oildataset表中獲取oildatasetid(映射到oildatasetstatus表)和samplepointid。 samplepointid被映射到也包含customersiteid的採樣點表。 customersiteid映射到包含customerid的customersite表。更新完成後,我需要更新oildataset表中的oillabid。我猜這必須使用兩個語句來完成(如下所示)。這些陳述看起來是正確的還是有明顯的錯誤?無論如何要在一個聲明中執行這兩個更新?謝謝。

update oildatasetstatus set oildatasetstatusid = 
case 
     WHEN oildatasetstatusid = 5 THEN 16 
      WHEN oildatasetstatusid = 6 THEN 17 
      WHEN oildatasetstatusid = 7 THEN 18 
      WHEN oildatasetstatusid = 8 THEN 18 
      WHEN oildatasetstatusid = 9 THEN 18 
      WHEN oildatasetstatusid = 10 THEN 19 
       WHEN oildatasetstatusid = 11 THEN 20 
End  
where oildatasetid in 
(
select oildatasetstatusid from oildatasetstatus 
inner join oildataset on oildataset.oildatasetid=oildatasetstatus.oildatasetid 
where samplepoinid in 
    (
    select samplepointid from samplepoint where customersiteid in 
     (
     select customersiteid from customersite where customerid=2 
     ) 
    ) 
) 

update oildataset set oillabid=9 where oildatasetstatusid between 16 and 20 
+0

我建議清理的問題,格式化你的SQL,並提供了一些樣本數據,只是爲了讓問題更容易理解。 – achinda99 2009-02-18 14:30:55

回答

0

如何分解它並測試您是否獲得了正確的結果並逐漸將它們放在一起?

WHERE條件的初始UPDATE(編輯以有內部連接,而不是選擇INS),並選擇oildatasetid不oildatasetstatusid

SELECT oildatasetid FROM oildatasetstatus 
INNER JOIN oildataset 
    ON oildataset.oildatasetid = oildatasetstatus.oildatasetid 
INNER JOIN samplepoint 
    ON oildatasetstatus.samplepoinid = samplepoint.samplepointid 
INNER JOIN customersite 
    ON samplepoint.customersiteid = customersite.customersiteid 
WHERE customerid = 2; 

這應返回oildatasetid的同一列表作爲你的查詢,但跑得更快。

現在UPDATE語句:

UPDATE oildatasetstatus SET oildatasetstatusid = 
    CASE 
     WHEN oildatasetstatusid = 5 THEN 16 
     WHEN oildatasetstatusid = 6 THEN 17 
     WHEN oildatasetstatusid = 7 THEN 18 
     WHEN oildatasetstatusid = 8 THEN 18 
     WHEN oildatasetstatusid = 9 THEN 18 
     WHEN oildatasetstatusid = 10 THEN 19 
     WHEN oildatasetstatusid = 11 THEN 20 
    END 
WHERE oildatasetid IN (
    SELECT oildatasetid FROM oildatasetstatus 
    INNER JOIN oildataset 
     ON oildataset.oildatasetid = oildatasetstatus.oildatasetid 
    INNER JOIN samplepoint 
     ON oildatasetstatus.samplepoinid = samplepoint.samplepointid 
    INNER JOIN customersite 
     ON samplepoint.customersiteid = customersite.customersiteid 
    WHERE customerid = 2 
); 

我儘量避免BETWEEN,除非絕對必要:

UPDATE oildataset SET oillabid = 9 WHERE oildatasetstatusid >= 16 AND oildatasetstatusid <= 20;