Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用多个匹配项更新查询中的行_Sql Server_Tsql - Fatal编程技术网

Sql server 使用多个匹配项更新查询中的行

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语句:

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表只是一个随机问题?它的值是否多次更新?有兴趣了解默认行为。是的,它将被更新多次,但不能保证以何种顺序进行非常容易出错的方法。您将得到它更新的最后一个值。