Leetcode SQL题Exchange Seats指定条件作用及简化代码正确性问询
问题背景
seat表结构
| Column Name | Type |
|---|---|
| id | int |
| name | varchar |
id是该表的主键,为连续自增字段,表中每一行记录一名学生的ID和姓名,本次需求为交换相邻奇偶序号学生的座位。
现有两段SQL实现,需要解答对应问题:
第一段SQL代码
select (CASE when (select max(id) from seat)%2 = 1 and id = (select max(id) from seat) then id when id%2 = 1 then id+1 else id -1 end) as id,student from seat order by id
第二段简化SQL代码
select (CASE when (select max(id) from seat)%2 = 1 then id when id%2 = 1 then id+1 else id -1 end) as id,student from seat order by id
问题解答
1. id = (select max(id) from seat)条件的作用
这个条件是用来处理总学生数为奇数的边界场景:
如果总学生数为奇数,最大的id值必然也是奇数,此时排在最后的学生没有相邻的下一位可以配对交换,所以需要保留他的原id不变。这个条件和前面的(select max(id) from seat)%2 = 1组合后,就精准限定了只有「总人数为奇数,且当前是最后一名学生」的特殊情况才保留原id,其他所有学生都正常走交换逻辑。
2. 第二段简化SQL无法满足需求
简化后的SQL逻辑存在严重错误:它去掉了id = (select max(id) from seat)的限定,只要总人数为奇数,第一个CASE分支就会对所有学生生效,直接返回原id,完全不会执行后续的交换逻辑。
举个实际场景验证:假设表内共有5名学生(id为1~5,总人数为奇数):
- 第一段SQL执行后:id1变2、id2变1、id3变4、id4变3、id5保持5,排序后就是正确的交换结果
- 第二段SQL执行后:所有学生的id都保持原值,相当于完全没有做交换,自然不符合需求。
内容的提问来源于stack exchange,提问作者Ashima
相关产品推荐
相关产品推荐

