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实际上意味着“从表中给我一条随机记录”。“你永远不应该这么做。”佐哈普利非常抱歉我忘了加上它,谢谢你的提醒