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)
任何指针都将非常感激.提前谢谢大家,甚至读到这一点.
干杯.基思.
这个怎么样:
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)