问题1. 客户提供了一个号单,如:'A001','B002','X008','D003' 这个号单的顺序是有人为业务含义的。要求查询出这些号单的详细信息,并且查询出来的结果要按号单的提供顺序排序。
解决: 其实查询出来很简单,如: select * from table_a where formCode in ('A001','B002','X008','D003' );
关键是要按号单的顺序进行排序,实现方式可以参考oracle的函数,使用 instr 函数。
实现结果:
select * from table_a where fromCode in ('A001','B002','X008','D003' ) order by instr('A001,B002,X008,D003',formCode);
更科学稳妥的结果:
select * from table_a where fromCode in (',A001','B002','X008','D003' ) order by instr('A001,B002,X008,D003',','||formCode);
当然还有其他很多方法实现,比如数据库建一张临时表,把号单插入,并插入序号列,使用表关联实现排序。还有其他高人的一些方法,但我想 使用instr函数应该是最简单一种行之有效的方法了。
问题2. 表记录的列组合
例如: 表a 班级人员,表b 学生成绩,
表 a
班级编号 班级 学号 姓名
C001 一年1班 001 张三
C001 一年1班 002 李四
表 b
学号 姓名 科目 成绩
001,张三,语文,80
001,张三,数学,90
要求实现一个查询,查询一个班级所有的学生成绩,要求的列是: 班级编号 班级 学号 姓名 语文成绩 数学成绩
实现: 考虑到这时一个把表记录按类型提取到查询列上的要求,需要用多次表关联来实现。
实现结果:
select a.班级编号,a.班级,a.学号,a.姓名,b1.成绩,b2.成绩
from a left join (select 学号,成绩 from b where 课程=‘语文’) b1 on a.学号=b1.学号 left join select 学号,成绩 from b where 课程=‘数学’) b2 on a.学号=b2.学号