Sql从另一个表更新记录

Sql从另一个表更新记录,sql,sql-server,Sql,Sql Server,我正试图根据StudentId从Students表更新CurrentLevel上的FSB\u ProcessStudents 这是我的声明 UPDATE FSB_ProcessStudents SET Currentlevel = (SELECT s.LevelId From FSB_Students s INNER JOIN FSB_ProcessStudents ps ON ps.StudentId = s.StudentId) 在执行时,它给

我正试图根据
StudentId

Students
表更新
CurrentLevel
上的
FSB\u ProcessStudents
这是我的声明

UPDATE FSB_ProcessStudents SET Currentlevel = 
(SELECT 
    s.LevelId
    From FSB_Students s
    INNER JOIN FSB_ProcessStudents ps
         ON ps.StudentId = s.StudentId)
在执行时,它给了我一个错误:

子查询返回了多个值


哪里出错了?

Sql server支持在update语句中使用联接,因此您可以这样编写update语句:

UPDATE ps
SET Currentlevel = s.LevelId
FROM FSB_Students s
INNER JOIN FSB_ProcessStudents ps
     ON ps.StudentId = s.StudentId

您之所以会遇到此问题,是因为您的子查询返回多个值,并且不可能通过单个update语句更新多个值

所以,使用下面这样的关键词,它将得到解决

UPDATE FSB_ProcessStudents SET Currentlevel = 
(SELECT top 1
    s.LevelId
    From FSB_Students s
    INNER JOIN FSB_ProcessStudents ps
         ON ps.StudentId = s.StudentId order by ps.StudentId desc)

这个错误是不言自明的。子查询应该只返回一个值

试试这个:

UPDATE FSB_ProcessStudents SET Currentlevel = 
(SELECT TOP 1
    s.LevelId
    From FSB_Students s
    INNER JOIN FSB_ProcessStudents ps
         ON ps.StudentId = s.StudentId)
或者,确保添加其他条件以返回一个或无值。

尝试以下查询

UPDATE  ps
SET     ps.Currentlevel = s.LevelId
FROM    FSB_ProcessStudents ps
    INNER JOIN FSB_Students s   on s.StudentId = ps.StudentId

使用以下查询进行更新:

UPDATE FSB_ProcessStudents SET Currentlevel = LevelId
FROM FSB_Students S
WHERE FSB_ProcessStudents.StudentId = s.StudentId

您可以在子查询中使用Top 1。主要问题是它对我来说不符合逻辑。。它应该根据
StudentId
使用
TOP x
的可能重复项选择一个值,而不使用
ORDER BY
子句,实际意思是“从表中给我一条随机记录”。你不应该这样做。不是随机的:)。但这只是说明错误原因的一种方式。可能还需要添加其他条件,以确保返回正确的值。但我同意您的看法@Zohar Peled-TOP不应使用ORDER BY。如果不是随机的,您将如何称呼它?任何rdbms都不保证select语句中没有order by子句的记录顺序,因为数据库表本质上是无顺序的。它可能不像newID()下的order()那样随机,但它肯定不是可靠的。对我来说,随机意味着在这种情况下,当我运行查询时,99.99%的时间将返回其他结果。但是,如果不指定ORBER BY,结果将取决于rdbms引擎当时使用的计划。而且,连续运行很有可能使用相同的计划。所以,不是随机的:)@Tim谢谢。复制粘贴确实有它的缺点:-)在没有ORDERBY子句的情况下使用TOP x实际上意味着“从表中给我一条随机记录”。“你永远不应该这么做。”佐哈普利非常抱歉我忘了加上它,谢谢你的提醒