3.5.3连接

另一种表间关联是SQL的连接运算,集算器中的join函数可以实现类似的功能。但在有了记录和排列引用机制和align等函数后,这种运算变得不大常用了。

等值连接

外键字段可以通过相等的关系将一个表中的字段与另一个表中的记录引用相匹配,而用join函数实现的连接,是通过相等的关系将两个或多个表的记录引用相匹配。如:

 

A

1

=demo.query("select STATEID,NAME,POPULATION,ABBR from STATES")

2

=demo.query("select * from CITIES")

3

=A1.select(NAME>"C")

4

=A2.groups(STATEID:ID;count(~):Count)

5

=join(A3:StateInfo,STATEID;A4:CityCount,ID)

6

=join@1(A3:StateInfo,STATEID;A4:CityCount,ID)

7

=join@f(A3:StateInfo,STATEID;A4:CityCount,ID)

A3中选出了字母C及以后的州:

A4中则根据大城市表CITIES中的数据,统计出了各州的大城市总数:

需要注意的是,A3中并没有名称首字母为"A""B"的州,STATEID6开始才有数据。而并非所有州都有大城市记录,如A4中并没有ID4,7,8,…等各州的统计值。

A5中,根据各自的州序号将A3A4中的记录连接,结果如下:

从结果中可以看到,默认情况下,join函数连接的结果中仅包括两个表中州序号能够匹配的记录。结果可以看为一个由外键构成的序表,每个字段都是记录引用。

join函数大体相当于在SQL中写:select Ai.* as Fi,… from Ai,… where Ai.xj =… and …

这也是SQL中最常见的连接写法。

连接时,还可以使用其它模式,如A6中,join@1表示左连接,需要注意的是选项是数字@1,而不是小写字母@l,为了避免混淆,集算器中不使用小写字母L作为选项。A6中结果如下:

此时,A3中各州数据都返回到了结果中,其中有一些州无法在A4中找到对应的统计值,如州序号为7,8,…的各州。

A7中的join@f表示全连接,A7中结果如下:

此时,A3A4中各州数据都返回到了结果中,其中有一些州无法在A3中找到对应的统计值,如州序号为1,2,3,…的各州;也有一些无法在A4中找到对应的统计值,如州序号为7,8,…的各州。

同位连接

使用join函数连接不同序表中的记录引用时,是通过相等的关系。除此以外,还可以将不同的序表按照位置连接,这时需要添加选项@p,如:

 

A

1

=demo.query("select STATEID,NAME,POPULATION,ABBR from STATES order by STATEID")

2

=demo.query("select * from CITIES")

3

=A2.groups(STATEID:ID;count(~):Count)

4

=join@p(A1:StateInfo;A3:CityCount)

A3中根据大城市表CITIES中的数据,统计出了各州的大城市总数,注意其中缺少一些州的统计结果:

A4中将A1中所有州的信息,与A3中统计的结果同位连接,结果如下:

连接后,结果的记录条数将以连接时使用的最短序表为准。在同位连接时,仅仅将两个序表中的记录按照位置依次连接。如果用来连接的序表记录并不能对齐,这样获得的结果就无法保证数据相关。如上面的结果中,序号为4Arkansas州的数据,和序号为5的城市统计数据连接在了一起。

实际上,join@p是用于将几个数据长度和顺序都相同的表横向拼接在一起时使用的,如:

 

A

1

=demo.query("select * from STATENAME")

2

=demo.query("select * from STATECAPITAL")

3

=demo.query("select * from STATEINFO")

4

=join@p(A1:Name;A2:Capital;A3:Info)

A1,A2A3中的数据,都是全部州信息的一部分,且排列顺序相同:

 

此时,A4中用join@p就可以将这些信息连接在一起:

此时连接的结果就是正确的了。对于上例中的情况,应该用align函数将两表中的记录对位连接。

交叉连接

交叉连接是将多个序列中的成员一一配对。交叉连接是最基本的连接,生成结果时没有任何过滤条件,只是列出所有可能的组合,计算时使用xjoin函数。如:

 

A

1

[1,2,3,4]

2

[a,b,c]

3

=xjoin(A1:Number;A2:Letter)

A3中的结果如下:

可以看到,结果序表中的记录是数字和字母配对的所有组合。

在使用xjoin函数时,同样也可以交叉连接序表或排列中的记录,此时,还可以设定记录的过滤条件,如:

 

A

1

=demo.query("select * from STATES")

2

[M,F]

3

=demo.query("select * from EMPLOYEE")

4

=xjoin(A1:State;A2:Gender;A3:Employee,STATE==State.NAME&& GENDER==Gender)

A1中取出各州的信息,A2中设定性别序列,A3中取到员工资料。在A4中交叉连接时,连接A3中的员工资料时,设定了过滤条件,只取出指定州和性别的记录来连接。A4中的结果如下: