我有一个存储过程,该过程将更新多个行,其中多个数据列上的两个表之间有匹配项。
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)
记录?
答案 0 :(得分:1)
不确定效率最高,但是我将使用公用表表达式为max(tid)
,DateofBirth
和MemberFirst
的每种组合获取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
);