Sql server 使用多个匹配项更新查询中的行
给出这样的update语句:Sql server 使用多个匹配项更新查询中的行,sql-server,tsql,Sql Server,Tsql,给出这样的update语句: 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.G
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
如果一个用户可以有多个与join子句与vw_CompletedAssessments匹配的记录,那么哪个记录将用于更新?是否有办法订购,以便使用最大或最小评估日期 如果找到多个匹配项,则所有匹配项都将更新 如果只想更新一个,可以使用UPDATE TOP 1吗
如果要保证要更新的顺序,请尝试添加适当的order BY子句。您的更新语法需要进行一些调整,请参见以下内容:
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
现在说到这里,如果您有多个值,并且您想从Comp表中选择一个特定值,那么您可以使用像这样的行数函数
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
此查询将ua.AssessmentDate更新为特定NatId的最新comp.AssessmentDate。类似地,您可以看到如何使用行号操纵结果。如果要将其更新为最旧的comp.AssessmentDate值,只需将row_number函数中的order by子句更改为ASC,依此类推……我希望更新所有用户评估记录。我的意思是,如果vw_CompletedAssessment中有多个条目,记录如何更新?另外,我在更新文档中看不到orderby。它将如何使用?是否有或可能更合适的帮助?是的,我简化了实际的查询,因此语法不正确。回答得好,我明天查一下,给你打勾。不过,在原始查询中,哪一行将更新UserAssessment表只是一个随机问题?它的值是否多次更新?有兴趣了解默认行为。是的,它将被更新多次,但不能保证以何种顺序进行非常容易出错的方法。您将得到它更新的最后一个值。