如何通过更新申请订单?

时间:2013-12-29 02:51:35

标签: sql-server

我正在尝试更新临时表中的值但在更新之前我想根据日期按记录排序。

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

进行更新

提前致谢

3 个答案:

答案 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