如果字段或字段组合k是表M的主键,而k也同时存在于表B,则k就是B的外键。外键维系着表之间的关联关系,是结构化数据计算最重要的概念之一。集算器可以通过对象引用方便地实现外键功能,下面用几个例子来说明:

   例1 关联主子表1

   订单表(order)是子表,员工表(emp)是主表,请将emp关联到order中,显示emp中的NameGenderSalary字段以及order中的OrderID,Amount字段。

    说明:本例只用到emporder,之后的例子还要用到部门表(dep),三者外键关系如下。

wKioL1PpsNLwPCb_AAE1bHz5SI0199.jpg

    数据可以来自于数据库或文本,比如:

         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)

计算结果

wKiom1Ppr7qDC2R-AACOCpRxjCI465.jpg

代码解读

    A3:将order中的SellerID替换成emp中对应的记录,建立两者的外键关系。

    A4:取order中的OrderIDAmount字段,通过关联引用取emp中的NameGenderSalary字段。可以看到,用对象引用可以从order直接访问emp中的字段,省去了复杂难懂的join语句。

 

2按照主表条件查询子表

    找出薪水大于10000的女性销售签下的订单。

集算器代码:

         A3=order.switch(SellerId, emp:EId)         /同上一个例子

         A5=order.select(SellerId.Salary>10000&& SellerId.Gender=="F")

计算结果

wKioL1PpsNPw_6iuAACa1LT8rds669.jpg

      点击上述蓝色超链接,可以看到对应的员工信息为:

wKiom1Ppr7ziIWXSAADDvlM9FWY263.jpg

3:按照主表分组

    计算各部门的销售额。

集算器代码:

    A3=order.switch(SellerId, emp:EId)         /同上一个例子

    A5=order.groups(SellerId.Dept;sum(Amount))

计算结果:

  wKioL1PpsNWwxTZTAAB0pQpyz6c193.jpg

    可以给字段改名,比如order.groups(SellerId.Dept:dt;sum(Amount):amt),改名后的效果如下:

wKiom1Ppr76gJmbLAABuPBfOWHs262.jpg

 

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)

计算结果:

wKioL1PpsNfzmuwUAAAd5ihTnzI463.jpg

代码解读:

         A3,A4,A5:建立完整的外键关系。

         A6: 计算各部门的销售额(见上一例子)。即:

wKiom1Ppr7-SliMIAABs-enRAbA051.jpg

    A7:使用对象引用直观求解。表达式A6.select(amt<=50000).(dt).(Manager).(Name)可以根据句号分解为四步,即:

    1A6中找出销售额超50000的记录。

    2取得dt字段对应的记录(在dep表中)。

    3取得Manager字段对应的记录(在emp表中)。

    4取得Name字段。

具体如下:

A6.select(amt<=50000)  wKiom1Ppr8DyeSXDAAAs0CvWNP0200.jpg

 

.(dt)                                       wKioL1PpsNnSwd1WAABEWju7zRc659.jpg

.(Manager)                       wKiom1PpsOzxR1PjAABug3bn2mE956.jpg

.(Name)                        wKioL1PpsgWD0r2VAAAbRasHZqM316.jpg