具有多个匹配项的查询中的UPDATE行

Sim*_*n C 0 t-sql sql-server

给定这样的更新语句:

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

M.A*_*Ali 5

您的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,依此类推。