SQL学院席位分配算法中如何将静态配额判断替换为剩余席位计算
录取分配算法SQL修改方案
核心修改思路
把你提供的剩余席位计算逻辑作为临时子查询,替换原有直接关联tblAcademy的逻辑,关联后过滤remainingSeat > 0的学院即可。
修改后的scmd2.CommandText代码
scmd2.CommandText = @" select acad_Id,stud_Id from( SELECT tas.*, DENSE_RANK() OVER (PARTITION BY stud_id ORDER BY order_preference) AS row_id FROM ( -- 带剩余席位计算的学院临时表 SELECT distinct ta.acad_Id, ta.numberOfSeats - Count(ts.acad_id) OVER (PARTITION BY ta.acad_Id) as remainingSeat FROM tblAcademy ta LEFT JOIN tblStudent ts ON ta.acad_Id = ts.acad_Id ) ta JOIN tblAcademy_Selection tas ON ta.acad_Id = tas.acad_Id WHERE ta.remainingSeat > 0 and stud_Id = @studId ) DTL WHERE row_id = 1 "; // 补充参数化查询避免SQL注入风险 scmd2.Parameters.AddWithValue("@studId", array[a]);
优化说明
- 原剩余席位查询的隐式连接调整为
LEFT JOIN,逻辑更清晰,也能正确计算还没有任何学生录取的学院的剩余席位 - 替换了原有的字符串拼接传参逻辑为参数化查询,避免SQL注入风险
- 单次仅查询单个学生的志愿,用
=替代IN查询性能更好
内容的提问来源于stack exchange,提问作者DeathStriker2
相关产品推荐
相关产品推荐

