SQL Server: instruction de mise à JOUR où MAX requête

Je suis en train de faire une migration de données dans SQL Server 2008 R2. Je suis un SQL-Serveur de noob, mais je sais Ingres et MySql assez bien.

J'ai besoin de "valeurs par défaut" pour les deux nouveaux champs à "valeurs actuelles" à partir d'une autre table. Voici ma première naïve tentative (comment je le ferais dans Ingres).

update  rk_risk
set     n_target_probability_ID = a.n_probability_ID
      , n_target_consequence_ID = a.n_consequence_ID
from    rk_assess a
WHERE   a.n_assess_id = (
    SELECT  MAX(n_assess_id)
    FROM    rk_assess a2
    WHERE   a2.n_risk_id = a.n_risk_id
);

La requête ci-dessus s'exécute sans erreur dans la suite, mais elle définit TOUS la n_target_probability_ID & n_target_consequence_ID à la même valeur... que de la pure et simple de la dernière évaluation (comme revêtue de "la dernière évaluation DE CE RISQUE").

La rk_assess table contient une histoire complète de dossiers d'évaluation pour rk_risks, et ma mission est de "défaut", la nouvelle cible de probabilité & conséquence de la colonne du risque tableau pour les valeurs de "l'actuel" (c'est à dire le dernier) dossier d'évaluation. Le rk_assess.n_assess_id colonne auto-incrémentée (identificateur immuable une fois), donc le max-id doit toujours être le dernier enregistrement.

J'ai eu un peu de recherche, à la fois dans google et DONC, et j'ai essayé un peu différent de la version de la requête, mais je suis toujours bloqué. Voici un couple de d'autres épique échoue, avec des références.

update  rk_risk
set     n_target_probability_ID = (select a.n_probability_ID from rk_assess a where a.n_assess_id = (select max(n_assess_id) from rk_assess a2 where a2.n_risk_id = a.n_risk_id) as ca)
      , n_target_consequence_ID = (select a.n_consequence_ID from rk_assess a where a.n_assess_id = (select max(n_assess_id) from rk_assess a2 where a2.n_risk_id = a.n_risk_id) as ca)
;

http://stackoverflow.com/questions/6256844/sql-server-update-from-select

update  r 
set     r.n_target_probability_ID = ca.n_probability_ID
      , r.n_target_consequence_ID = ca.n_consequence_ID
from    rk_risk r
join    rk_assess a
on      a.n_risk_id = r.n_risk_id

select  r.n_risk_id
          , r.n_target_probability_ID, r.n_target_consequence_ID
          , ca.n_probability_ID, ca.n_consequence_ID
from    rk_risk r
join    rk_assess a
on      a.n_risk_id = r.n_risk_id

http://stackoverflow.com/questions/4024489/sql-server-max-statement-returns-multiple-results

UPDATE  rk_risk
SET     n_target_probability_ID = ca.n_probability_ID
      , n_target_consequence_ID = ca.n_consequence_ID
FROM    ( rk_assess a
INNER JOIN (
       SELECT MAX(a2.n_assess_id)
       FROM   rk_assess a2
       WHERE  a2.n_risk_id = a.n_risk_id
) ca -- current assessment

Tous les pointeurs serait grandement apprécié. Je vous remercie tous à l'avance, même pour la lecture de ce jour.

Acclamations. Keith.

Doit-il être effectué en une seule instruction?

OriginalL'auteur corlettk | 2011-06-17