2012-02-22 2 views
0

J'ai un formulaire qui affiche une liste de systèmes avec leur état actuel. L'utilisateur peut changer l'état et la date de ce changement d'état est stockée dans une table d'historique. L'utilisateur peut également modifier le nom du serveur en cas de changement d'état (par exemple, si un système est remplacé en raison d'un appel de bail).SQL Server 2000: mise à jour d'une table avec des valeurs d'une autre table

La table d'historique stocke les détails par systemname. Par conséquent, si le nom du système change sur le formulaire, l'historique doit également être mis à jour (avec tous les changements historiques). Sur le formulaire, il y a un champ caché nommé originalsystemName donc nous savons si le systemname correspond ou non lorsque le formulaire est sauvegardé. Je suis venu avec la requête suivante, mais j'obtiens une erreur (voir ci-dessous la requête)

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 
) 

erreur que je reçois:

sous-requête amène à plus de 1 valeur. Ceci n'est pas autorisé lorsque la sous-requête suit =,! =, <, < =,>,> = ou lorsque la sous-requête est utilisée comme expression.

+0

@ michael-fredrickson merci pour les modifications. – HPWD

+0

Juste une friandise supplémentaire au cas où ce n'était pas évident mais la table d'histoire pourrait avoir 1-100 entrées donc chaque entrée doit être mise à jour si le nom du système change (où systemname! = OriginalSystemname). – HPWD

+0

Afin d'obtenir des solutions précises, pourriez-vous s'il vous plaît fournir quelques lignes de données d'échantillon avant et après la mise à jour (inclure également au moins une ligne que vous ne voulez pas mettre à jour). Résoudre des problèmes de mots est amusant, mais cela entraîne beaucoup d'efforts inutiles ici. –

Répondre

2

Pour mettre à jour une table avec des valeurs d'une autre table, ceci est facilement accompli avec un join.

Dans ce scénario, la table sysHistory est reliée à la table systemInfo_tmp lorsque le systemInfo_tmp contient une systemName qui ne correspond pas à l'original, et systemName matchs de la sysHistory.

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

Merci! Je l'ai rendu beaucoup plus difficile que nécessaire. – HPWD

5

Est-il possible que ce soit ce que vous vouliez dire? Bien que, sauf s'il s'agit d'une table à une ligne, une clause WHERE semble manquante.

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

Ma conjecture est que 'systemInfo_tmp' peut ou non être associé à un' systemName' qui est changé. Donc, en vérifiant 't.originalSystemName <> t.systemName', nous savons que le nom a été mis à jour ... ma prochaine supposition est que pour associer le' systemName' mis à jour avec 'sysHistory', nous devons nous joindre sur 'h.systemName = t.originalSystemName' ... mais bien sûr je ne fais que deviner. –

+0

@Michael Oui, c'est là que les données de l'échantillon et les résultats souhaités seraient très utiles. –

+0

@MichaelFredrickson vous devinez correctement. – HPWD

Questions connexes