如果字段或字段组合k是表M的主键,而k也同时存在于表B,则k就是B的外键。外键维系着表之间的关联关系,是结构化数据计算最重要的概念之一。集算器可以通过对象引用方便地实现外键功能,下面用几个例子来说明:
例1 关联主子表1:
订单表(order)是子表,员工表(emp)是主表,请将emp关联到order中,显示emp中的Name、Gender、Salary字段以及order中的OrderID,Amount字段。
说明:本例只用到emp和order,之后的例子还要用到部门表(dep),三者外键关系如下。
数据可以来自于数据库或文本,比如:
order=esProc.query("selectOrderID,SellerId,Amount,OrderDate from sales")
emp=esProc.query("selectEId,Name,Gender,Birthday,Dept,Salary from emp")
dep=esProc.query("select* from department")
集算器代码
A3=order.switch(SellerId, emp:EId)
A4=order.new(OrderID,Amount,SellerId.Name,SellerId.Gender,SellerId.Salary)
计算结果
代码解读
A3:将order中的SellerID替换成emp中对应的记录,建立两者的外键关系。
A4:取order中的OrderID、Amount字段,通过关联引用取emp中的Name、Gender、Salary字段。可以看到,用对象引用可以从order直接访问emp中的字段,省去了复杂难懂的join语句。
例2:按照主表条件查询子表
找出薪水大于10000的女性销售签下的订单。
集算器代码:
A3=order.switch(SellerId, emp:EId) /同上一个例子
A5=order.select(SellerId.Salary>10000&& SellerId.Gender=="F")
计算结果
点击上述蓝色超链接,可以看到对应的员工信息为:
例3:按照主表分组
计算各部门的销售额。
集算器代码:
A3=order.switch(SellerId, emp:EId) /同上一个例子
A5=order.groups(SellerId.Dept;sum(Amount))
计算结果:
可以给字段改名,比如order.groups(SellerId.Dept:dt;sum(Amount):amt),改名后的效果如下:
例4:较复杂的多表关联
对于销售额超50000的部门,请找出其部门经理的名字。
集算器代码:
A3=order.switch(SellerId,emp:EId)
A4=dep.switch(Manager,emp:EId)
A5=emp.switch(Dept,dep:DeptNo)
A6=order.groups(SellerId.Dept:dt;sum(Amount):amt)
A7=A6.select(amt<=50000).(dt).(Manager).(Name)
计算结果:
代码解读:
A3,A4,A5:建立完整的外键关系。
A6: 计算各部门的销售额(见上一例子)。即:
A7:使用对象引用直观求解。表达式A6.select(amt<=50000).(dt).(Manager).(Name)可以根据句号分解为四步,即:
1、从A6中找出销售额超50000的记录。
2、取得dt字段对应的记录(在dep表中)。
3、取得Manager字段对应的记录(在emp表中)。
4、取得Name字段。
具体如下:
原文地址:http://esproc.blog.51cto.com/8028595/1538975