使用日期字段上的内部联接更新Max(ID)

时间:2019-03-13 23:17:43

标签: tsql stored-procedures

我有一个存储过程,该过程将更新多个行,其中多个数据列上的两个表之间有匹配项。

TD表中可能有多个匹配项,我只想更新MAX(TID)表中的TD记录。我已经尝试了几种不同的方法,但是要么获得所有比赛的更新,要么没有任何更新。

该联接使用Date of Birth和其他一些列来查找匹配项。我需要更新SubID和其他找到匹配项的其他字段。

什么是最好,最有效的方法?

Update TD
       SET     
       TD.SubID = NM.SubscriberID,  
       TD.EffectiveDate = NM.EffectiveDate,
       TD.LastUpdate = GETDATE()
       FROM TD
        INNER JOIN NM
        ON TD.DateofBirth = NM.DateofBirth
        WHERE       
        TD.MemberFirst = NM.MemberFirst
        AND TD.MemberLast = NM.MemberLast   
        AND TID IN (     
                        SELECT MAX(TID)
                        FROM TD td2             
                        INNER JOIN NM nm2
                        ON td2.DateofBirth = nm2.DateofBirth
                        WHERE td2.MemberFirst = nm2.MemberFirst
                        AND td2.MemberLast = nm2.MemberLast 
                );

此结果=没有更新。我该怎么做才能仅更新MAX(TID)记录?

2 个答案:

答案 0 :(得分:1)

不确定效率最高,但是我将使用公用表表达式为max(tid)DateofBirthMemberFirst的每种组合获取MemberLast并更新联接的表到CTE:

WITH CTE AS
(
    SELECT TD.DateofBirth, TD.MemberFirst, TD.MemberLast, MAX(TID) As MaxTID
    FROM TD 
    INNER JOIN NM 
    ON TD.DateofBirth = NM.DateofBirth
    WHERE TD.MemberFirst = NM.MemberFirst
    AND TD.MemberLast = NM.MemberLast 
    GROUP BY TD.DateofBirth, TD.MemberFirst, TD.MemberLast
)

UPDATE T
SET SubID = NM.SubscriberID,  
    EffectiveDate = NM.EffectiveDate,
    LastUpdate = GETDATE()
FROM TD As T
JOIN CTE 
    ON T.DateofBirth = CTE.DateofBirth
    AND T.MemberFirst = CTE.MemberFirst
    AND T.MemberLast = CTE.MemberLast
    AND T.TID = CTE.MaxTID

答案 1 :(得分:1)

如果您有兴趣,则您发布的代码无法正常工作的原因是,您的子查询与外部查询完全没有关联。

您说什么都没有更新,但是实际上应该更新一行:整个表中带有MAX(TID)的行。也许只是看起来该行没有得到更新,因为它已经具有您的代码会将其更改为的值。

如果您仅将last子句更改为以下代码,则您的代码应该可以工作:

    AND TID = (     
                    SELECT MAX(TID)
                    FROM TD td2          
                    WHERE  td2.DateofBirth = NM.DateofBirth
                    AND td2.MemberFirst = NM.MemberFirst
                    AND td2.MemberLast = NM.MemberLast 
            );