给定这样的更新语句:
UPDATE
UserAssesment
SET
AssessmentDate = comp.AssessmentDate
FROM
UserAssesment ua
INNER JOIN
vw_CompletedAssessments comp
On
ua.NatId = comp.NatId and
ua.FamilyName = comp.ClientLastName and
ua.GivenName = comp.ClientFirstName
WHERE
ua.HasCompletedAssessment <> 0
Run Code Online (Sandbox Code Playgroud)
如果用户可以有多个与join子句匹配的vw_CompletedAssessments记录,哪个记录将用于更新?有没有办法订购它,以便使用最大值或最小值AssessmentDate?
您的UPDATE语法需要进行一些调整,如下所示:
UPDATE ua
SET
ua.AssessmentDate = comp.AssessmentDate
FROM UserAssesment ua
INNER JOIN vw_CompletedAssessments comp
ON ua.NatId = comp.NatId and
ua.FamilyName = comp.ClientLastName and
ua.GivenName = comp.ClientFirstName
WHERE ua.HasCompletedAssessment <> 0
Run Code Online (Sandbox Code Playgroud)
现在到了要点,如果您有多个值,并且想要从Comp表中选择一个特定的值,则可以使用ROW_NUMBER函数,如下所示:
UPDATE ua
SET
ua.AssessmentDate = comp.AssessmentDate
FROM UserAssesment ua
INNER JOIN (SELECT *
, ROW_NUMBER() OVER (PARTITION BY NatId ORDER BY AssessmentDate DESC) rn
FROM vw_CompletedAssessments) comp
ON ua.NatId = comp.NatId
and ua.FamilyName = comp.ClientLastName
and ua.GivenName = comp.ClientFirstName
WHERE ua.HasCompletedAssessment <> 0
AND Comp.rn = 1
Run Code Online (Sandbox Code Playgroud)
该查询将针对特定的NatId将ua.AssessmentDate更新为最新的comp.AssessmentDate。同样,您可以看到如何使用行号处理结果。如果要将其更新为最早的comp.AssessmentDate值,只需将row_number()函数中的order by子句更改为ASC,依此类推。