【摘要】
从数据表中选出数据时,有时候需要判断成员在某些条件下是否存在,这些条件可能是从其他的数据表中查询的。例如分数是成绩表的字段,怎样从学生表中选出各科分数都高于 80 分的学生?如何简便快捷的处理结构化数据中的存在判断问题,这里为你全程解析,并提供 esProc 示例代码。结构化数据中的存在判断问题
1. 外键映射的存在性检测
在两个表中,根据外键映射的存在性查找记录。
【例 1】 统计一班男生的平均分。成绩表和学生表如下:
【解题思路】
从分数表选出数据时,判断是否存在班级的名称是一班且学生性别是男性的记录,如果存在则选出。
【SPL 脚本】
A | B | |
1 | =connect("db") | /连接数据库 |
2 | =A1.query("select * from Score") | /查询学生表 |
3 | =A1.query("select * from Student") | /查询学生成绩表 |
4 | =A3.select(Class=="Class 1" && Gender=="Male") | /选出一班男生 |
5 | =A2.join@i(Class:StudentID, A4:Class:ID) | /使用函数 A.join@i() 连接过滤 |
6 | =A5.groups(StudentID; avg(Score):Score) | /分组汇总每个学生的平均分 |
A6的执行结果如下:
StudentID | Score |
1 | 76 |
3 | 74 |
… | … |
当外键表数据量大时,可以使用游标的有序归并来解决。
【例 2】 查询 2014 年每月没有使用折扣的订单数量。订单表和订单明细表如下:
【解题思路】
从订单表选出数据时,判断是否存在折扣为 0 的订单,如果存在则选出。
【SPL 脚本】
A | B | |
1 | =connect("db") | /连接数据库 |
2 | =A1.cursor("select * from Order where year(Date)=2014 order by ID") | / |