SQL Server 2000: обновление одной таблицы значениями из другой таблицы - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть форма, которая отображает список систем вместе с их текущим статусом. Пользователь может изменить статус, и дата этого изменения статуса сохраняется в таблице истории. Пользователь также может изменить имя сервера при изменении состояния (например, если система заменяется из-за перебоя в аренде).

В таблице истории данные хранятся в формате 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 значения. Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения.

Ответы [ 2 ]

5 голосов
/ 23 февраля 2012

Возможно ли, что вы это имели в виду?Хотя, если это не таблица из одной строки, похоже, отсутствует пункт WHERE.

UPDATE h
    SET SystemName = t.systemname
    FROM SysHistory AS h
    INNER JOIN systemInfo_tmp AS t
    ON h.systemname <> t.originalSystemName;
2 голосов
/ 23 февраля 2012

Чтобы обновить таблицу значениями из другой таблицы, это легко сделать с помощью join.

В этом сценарии таблица sysHistory присоединяется к таблице systemInfo_tmp, когда systemInfo_tmp содержит systemName, который не соответствует оригиналу, и sysHistory * systemName совпадения.

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