SQL Server 2000:使用另一个表中的值更新一个表

时间:2012-02-22 20:50:58

标签: sql sql-server 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
)

我收到错误:

  

子查询返回的值超过1。当子查询遵循=,!=,&lt;,&lt; =,&gt;,&gt; =或子查询用作表达式时,不允许这样做。

2 个答案:

答案 0 :(得分:5)

这可能是你的意思吗?虽然这是一行表,但似乎缺少WHERE条款。

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

答案 1 :(得分:2)

要使用其他表格中的值更新表格,可以使用join轻松完成此操作。

在这种情况下,当sysHistory包含与原始版本不匹配的systemInfo_tmp时,systemInfo_tmp表会加入systemName表格,sysHistory表格1}} systemName匹配。

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