2012-02-22 95 views
0

我有一個表單,顯示系統列表及其當前狀態。用戶可以更改狀態,並將狀態更改的日期存儲在歷史記錄表中。用戶還可以在狀態發生變化時更改服務器的名稱(例如,如果系統由於租賃卷而被替換)。SQL Server 2000:使用另一個表中的值更新一個表

歷史記錄表按systemname存儲詳細信息,因此如果系統名稱在表單上更改,則歷史記錄也需要更新(以及所有歷史更改)。在表單中,有一個隱藏字段名爲originalsystemName,因此我們知道systemname匹配或不保存表單時。

<input type='text' name='systemname'> 
    <input type='text' name='originalSystemName'> 
    <input type='text' name='status'><input type='submit' type='submit'> 

我想出了以下查詢,但我得到一個錯誤(查看下面的查詢)。

update SysHistory set 
SystemName = (
    select distinct t.systemname 
    from systemInfo_tmp t, SysHistory h 
    where t.systemname != t.originalSystemName 
)  
where systemname in (
    select distinct t1.originalSystemName 
    from systemInfo_tmp t1, SysHistory h1 
    where t1.systemname != t1.originalSystemName 
) 

錯誤我收到:

子查詢返回多個值。當子查詢遵循=,!=,<,< =,>,> =或當子查詢用作表達式時,這是不允許的。

+0

@ michael-fredrickson感謝您的編輯。 – HPWD 2012-02-22 20:59:53

+0

只是一個額外的消息,如果它不明顯,但歷史表可能有1-100個條目,因此如果系統名稱更改(其中systemname!= originalSystemname),每個條目需要更新。 – HPWD 2012-02-22 21:00:54

+0

爲了獲得準確的解決方案,您可以在更新之前和之後提供幾行示例數據(還包括至少一行,您*不*要更新)。解決文字問題很有趣,但是這會導致很多浪費。 – 2012-02-22 21:13:29

回答

2

要使用另一個表中的值更新表格,可以使用join輕鬆完成。

在這種情況下,sysHistory表被加入到systemInfo_tmp表時systemInfo_tmp包含systemName不匹配原始和sysHistorysystemName匹配。

update sh 
set systemName = t.systemName 
from 
    sysHistory sh join 
    systemInfo_tmp t on 
     t.originalSystemName = sh.systemName 
     and t.originalSystemName != t.systemName 
+0

謝謝!我做得比需要的要難得多。 – HPWD 2012-02-22 21:25:33

5

這可能是你的意思嗎?雖然除非這是一行表格,但似乎缺少WHERE條款。

UPDATE h 
    SET SystemName = t.systemname 
    FROM SysHistory AS h 
    INNER JOIN systemInfo_tmp AS t 
    ON h.systemname <> t.originalSystemName; 
+0

我的猜測是'systemInfo_tmp'可能會也可能不會被關聯到一個被改變的'systemName'。所以通過檢查't.originalSystemName <> t.systemName',我們知道這個名字已經更新了......我的下一個猜測是,爲了將更新後的'systemName'和'sysHistory'關聯起來,我們必須加入'h.systemName = t.originalSystemName' ...但我當然只是在猜測。 – 2012-02-22 21:12:07

+0

@Michael是的,這是樣本數據和預期結果非常有用的地方。 – 2012-02-22 21:12:44

+0

@MichaelFredrickson你猜對了。 – HPWD 2012-02-22 21:27:50