在数据库应用开发中,我们经常需要面对复杂的SQL式计算,比如多层分组中的关联计算。由于SQL分组时必须同时汇总,并且不能进行对象式关联访问,因此处理这类问题会比较复杂,只能用窗口函数嵌套多层的子查询的高级技巧来实现。集算器支持真正的分组,直观的对象式关联访问,解决这类问题更加容易。
分组关联在实际业务中遇到的较多,比如http://forums.bit-tech.net/showthread.php?t=207052。下面以链接中的实际业务为蓝本设计一个更通用的例子,用来说明集算器实现分组关联的具体过程。
计算目标:查询出缺货的DVD分店,即现存的DVD拷贝不到4类的分店。
数据结构:Branch表,存储DVD分店信息。DVD表,存储DVD的标题及分类信息,DVD是虚拟的数据,比如“变形金刚4”是一个DVD,但它不是一张可见的光盘。DVDCopy表,存储DVD的多张拷贝,DVD拷贝是真正的光盘,以实体形式存放于各个分店。注意:DVDCopy表以BranchID字段和Branch表关联,以DVDID字段和DVD表关联。下面是部分数据:
分组关联在实际业务中遇到的较多,比如http://forums.bit-tech.net/showthread.php?t=207052。下面以链接中的实际业务为蓝本设计一个更通用的例子,用来说明集算器实现分组关联的具体过程。
计算目标:查询出缺货的DVD分店,即现存的DVD拷贝不到4类的分店。
数据结构:Branch表,存储DVD分店信息。DVD表,存储DVD的标题及分类信息,DVD是虚拟的数据,比如“变形金刚4”是一个DVD,但它不是一张可见的光盘。DVDCopy表,存储DVD的多张拷贝,DVD拷贝是真正的光盘,以实体形式存放于各个分店。注意:DVDCopy表以BranchID字段和Branch表关联,以DVDID字段和DVD表关联。下面是部分数据:
Branch表:
DVD表:
DVDCopy表:
说明:
(1)计算结果应当是Branch表中的某些记录。
(2)DVDCopy表中的Status字段如果是“Miss”,则说明光盘丢失。LastDateReturned字段如果为空,则说明光盘借出尚未归还。显然,丢失或未归还的光盘不在计算范围内,应当过滤掉。
(3)应当考虑某些分店可能在DVDCopy表中不存在记录,虽然这种情况比较罕见。
思路:
(1)从DVDCopy表过滤出有效的、