SQL Server:UPDATE语句,其中MAX查询

cor*_*ttk 3 sql sql-server subquery max sql-update

我在SQL Server 2008 R2中进行数据迁移.我是一个SQL-Server noob,但我非常了解Ingres和MySql.

我需要将两个新字段的"默认值"设置为另一个表中的"当前值".这是我的第一次天真尝试(我如何在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
);
Run Code Online (Sandbox Code Playgroud)

上述查询在续集中执行时没有错误,但它将所有 n_target_probability_ID的&n_target_consequence_ID设置为相同的值 ... OUTRIGHT最后一次评估的值(与"此风险的最后评估"相对应).

rk_assess表包含rk_risks 的评估记录的完整历史记录,我的任务是将风险表的新目标概率和后果列"默认"为"当前"(即最后一个)评估记录中的值.该rk_assess.n_assess_id列是一个自动递增的标识符(一旦设置为不可变),因此max-id应该始终是最后输入的记录.

我在google和SO上都进行了一些搜索,并尝试了一些不同版本的查询,但我仍然卡住了.这里有几个史诗般的失败,有参考.

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
Run Code Online (Sandbox Code Playgroud)

任何指针都将非常感激.提前谢谢大家,甚至读到这一点.

干杯.基思.

Jer*_*ose 6

这个怎么样:

update  rk_risk
set     n_target_probability_ID = a.n_probability_ID
      , n_target_consequence_ID = a.n_consequence_ID
from    rk_assess a
JOIN    (
    SELECT  n_risk_id, MAX(n_assess_id) max_n_assess_id
    FROM    rk_assess
    GROUP BY n_risk_id
    ) b
ON  a.n_risk_id = b.n_risk_id AND a.n_assess_id = b.max_n_assess_id
WHERE   a.n_risk_id = rk_risk.n_risk_id
Run Code Online (Sandbox Code Playgroud)