我正在尝试更新临时表中的值但在更新之前我想根据日期按记录排序。
UPDATE INS
set ins.PrefferedEmail = IC.CntcInfoTxt
From #Insured INS
Inner Join InsuredContact IC
on IC.InsuredId = INS.Insuredid and IC.ExpDt < Getdate() And (INS.InsuredStatus = 'Expired' or INS.InsuredStatus = 'Merged')
Where IC.CntcTypeCd = 'EML' and IC.InsuredId = @InsuredId and MAX(IC.ExpDt) ExpDt
我想根据此列IC.ExpDt
进行更新提前致谢
答案 0 :(得分:1)
我认为你正在混淆UPDATE与SELECT(正确)数据进行更新。
我用公共表表达式(cte)和rank()函数解决了这个问题。 cte是获取子查询结果的好方法。需要排名才能找到最新的联系信息。
-- 1 - Get id, contact text, expired date, with a rank by expired date
-- 2 - Join with table to update, select rank = 1
;
WITH cteRecentContactInfo
AS
(
SELECT
ic.InsuredId,
ic.CntcInfoTxt,
ic.ExpDt,
RANK() OVER (ORDER BY ic.ExpDt DESC) as RankByDt
FROM
InsuredContact as ic
WHERE
ic.CntcTypeCd = 'EML' and ic.ExpDt < getdate()
)
UPDATE ins
FROM #Insured ins INNER JOIN cteRecentContactInfo rci
ON ins.Insuredid = rci.Insuredid and ins.ExpDt = rci.ExpDt
WHERE
(ins.InsuredStatus = 'Expired' OR ins.InsuredStatus = 'Merged') AND
rci.RankByDt = 1
答案 1 :(得分:0)
更新和排序不起作用。行不一定以任何特定顺序存储,因此排序和更新完全独立。 如果您只想基于MAX(ExpDt)进行更新,则需要一个子查询来提升它。
UPDATE INS
SET INS.PrefferedEmail = tempOutside.CntcInfo
FROM (SELECT IC.CntcInfo,IC.InsuredID FROM
InsuredContact IC INNER JOIN
(SELECT MAX(IC.ExpDt) AS MaxExpDt,IC.InsuredID
FROM IC
WHERE IC.ExpDt < Getdate()
AND IC.CntcTypeCd = 'EML'
GROUP BY IC.InsuredID) AS tempInside
ON tempInside.InsuredID = IC.InsuredID
AND IC.ExpDt = tempInside.MaxExpDt) AS tempOutside
INNER JOIN INS ON tempOutside.InsuredID = INS.InsuredId
WHERE (INS.InsuredStatus = 'Expired' OR INS.InsuredStatus = 'Merged')
AND INS.InsuredID = @InsuredID
在不相关的注释上,为了对代码进行维护的人的利益,您可能需要考虑修复拼写错误(例如,应该是首选而不是'Preffered')并为表提供更有意义的名称。此外,由于您只使用@InsuredID中的一个ID,您可以简化代码并删除一个或两个内部联接,但我所拥有的应该可以同时更新多个记录,而不仅仅是@InsuredID选择的记录。
答案 2 :(得分:0)
感谢您的时间和意见。我做到了这一点并且工作正常
更新INS
设置ins.PrefferedEmail = ICC.CntcInfoTxt
来自#Insured INS
内部联接
(
选择
InsuredId,
CntcInfoTxt,
CntcTypeCd
来自InsuredContact ICC
其中ExpDt =(从InsuredContact中选择MAX(ExpDt),其中ExpDt&lt; GETDATE()和CntcTypeCd ='EML'和InsuredId = 10)
)作为ICC
在ICC.InsuredId = INS.InsuredId和(INS.InsuredStatus ='过期'或INS.InsuredStatus ='合并')
其中ICC.InsuredId = @InsuredId