公司的模拟机教员排班查询,
数据只需要从 SIM_TEACHER 表里面得到, 但是遇到了排序问题。
本来只需要根据 Teacher No 排序, 但是后来修改时 ,需要将 Teacher 数据删除,重新写入, 导致了Teacher No 混乱, 这下 ,可不能根据 Teacher No 排序了, 要找到排序字段, 需要关联到 SIM_TRAINING_SIM (SIM_TEACHER_ID), 再由 SIM_TRAINING_SIM 关联到 SIM_SUITE (SUITE_ID) 如图:
根据 SIM_SUITE 的 SUITE_NO , BATCH_NO 进行排序 。
如此多重的关联 , 而且, 考虑到将来跨套组的情况, 一个 SIM_TEACHER 还有可能对应到 多个 SIM_TRAINING_SIM ,这种情况下, 要取对应在 SIM_TRAINING_SIM 表里面的 SUITE_ID 最小值 如何设计 SQL 呢 ?
搜索到关于 LEFT JOIN 最小值关联的帖子, 设计到了 SQL :
select
t.PILOT_ID as pilotId,
p.pilot_name as pilotName,
t.TEACHER_LOCK as teacherLock,
d.unit_name as TUnitName
from SIM_TEACHER t inner join
flight.bd_aero_unit d on substr(t.t_unit,1,4)=d.unit_code
left join
flight.pilot_basic_info p on p.basic_info_id = t.PILOT_ID join
(
select t.batch_no , t.suite_no , m.sim_teacher_id , min(m.suite_id) suite_id
from sim_suite t
join sim_training_sim m on t.suite_id = m.suite_id
join sim_teacher u on m.sim_teacher_id = u.sim_teacher_id
group by t.batch_no , t.suite_no , m.sim_teacher_id
) sort on
sort.sim_teacher_id = t.sim_teacher_id
order by sort.batch_no, sort.suite_no, t.t_unit
在这里 , 构造了子表 SORT , 并且根据 SUIT_ID 取得了最小的 。
测试结果显示 ,这样的排序完全符合要求 。