2012-02-22 3 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 
) 

Ошибка я получаю:

Subquery вернулся более чем на 1 значение. Это недопустимо, когда подзапрос следует =,! =, <, < =,>,> = или когда подзапрос используется как выражение.

+0

@ michael-fredrickson благодарит за изменения. – HPWD

+0

Просто лишний лакомый кусочек в случае, если это не было очевидно, но таблица истории могла иметь 1-100 записей, поэтому каждая запись должна быть обновлена, если имя системы изменится (где systemname! = OriginalSystemname). – HPWD

+0

Чтобы получить точные решения, не могли бы вы предоставить несколько строк выборочных данных до и после обновления (также включить хотя бы одну строку, которую вы делаете * не * хотите обновить). Решать проблемы с текстом - это весело, но это приводит к большому количеству потраченных усилий. –

ответ

2

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

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

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

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' может или не может быть связано с измененным« системным именем ». Поэтому, проверяя 't.originalSystemName <> t.systemName', мы знаем, что имя было обновлено ... Следующее мое предположение заключается в том, что для того, чтобы связать обновленное' systemName' с 'sysHistory', мы должны присоединиться к 'h.systemName = t.originalSystemName' ... но, конечно, я просто догадываюсь. –

+0

@Michael Да, это то, где образцы данных и желаемые результаты были бы очень полезными. –

+0

@MichaelFredrickson вы правильно поняли. – HPWD

Смежные вопросы