在这种情况下,如何高效地编写sql查询?

在这种情况下,如何高效地编写sql查询?,sql,Sql,我有一个表,列出了学生和他们的等级 这样, studentName, studentRank 现在,在我的UI客户端,我在一个列表框中显示了所有学生的列表,按他们的等级排序 [ StudentName, StudentRank] 现在,该用户界面中的教授可以根据自己的选择拖放和重新排序学生,然后“保存” 保存时,我需要从列表框中获取列表,然后对表进行更新,以便现在根据UI中的列表对学生进行排序 要做到这一点,我现在正在做的最简单的方法是删除前面的所有行,然后通过在student表中每次插入

我有一个表,列出了学生和他们的等级

这样,

studentName, studentRank
现在,在我的UI客户端,我在一个列表框中显示了所有学生的列表,按他们的等级排序

[ StudentName, StudentRank] 
现在,该用户界面中的教授可以根据自己的选择拖放和重新排序学生,然后“保存”

保存时,我需要从列表框中获取列表,然后对表进行更新,以便现在根据UI中的列表对学生进行排序

要做到这一点,我现在正在做的最简单的方法是删除前面的所有行,然后通过在student表中每次插入后增加秩来逐个插入它们。 我觉得这是没有必要的……但我不确定


我想知道是否有更好的方法来实现这一点

在表字段中包括studentid,然后运行“按studentid更新”,这将比反复删除和插入数据更快。

如果您担心最小化数据库更改,您可以跟踪哪些行的列组发生了更改,并且只对这些行进行更新。这是否值得,取决于您的数据规模以及日志记录量(如果有)

例如,如果您有10名学生,交换等级为5和6,则最小更新仅影响2行,而默认的拖放和添加需要10次删除和10次插入。如果你将一名学生从第8名提升到第5名,你会有更多的更新,但仍然更少:

UPDATE student SET rank = rank + 1 WHERE ranking BETWEEN 5 AND 7
UPDATE student SET rank = 5 WHERE name = @name
但是,计算最佳SQL是复杂的,可能不值得付出努力。可能最好只更新更改的行


如果确实删除并重新插入,则可能需要截断而不是删除。并在事务中执行该操作,以确保删除有效,然后插入失败

如果表的大小足够小,您的UI可以管理它,那么删除/插入所有项目可能是可以管理的。您的人类用户可能会先抱怨UI不适,然后再抱怨DB插入太慢。请进行更新:
updatestudentrank=newRankVariable,其中studentName='nameVariable'
当教授决定将Student排名降低1分以上时,您的示例将如何那么怎么办?@AllBlond删除一个学生N个等级只会使接下来的N个学生每人增加1个等级。所以基本上是一样的。