本章介绍join()函数的多种用法。
描述:
连接游标对应的序表
语法:
joinx(csi:Fi,xj,..;…)
备注:
针对有序游标csi的结果集做join@m,返回新游标,xj参数全省略则使用主键连接. 有xj参数没主键则使用xj的值连接。支持多路游标,多路游标时必须路数相同。csi也可以是序表。
假定xj 有序,将多个游标csi按照关联字段/关联表达式xj和x1相等的关系连接,产生以Fi,…为字段的游标。Fi为引用字段,引用原游标序列csi中的记录。注意:xj…仅支持升序。
不管是多少个游标之间关联,都是和cs1中的x1相等判断,因此是一对多的关系
选项:
@f |
全连接,找不到匹配值时,则与null对应 |
@1 |
左连接(注意:这里是数字1,不是字母l) |
@p |
按位置连接,忽略xj参数 |
@u |
只有cs1是游标,其它都是内存序表,此时不要求有序 |
参数:
Fi |
结果序表的字段名 |
csi |
用于连接的游标或序表 |
xj |
连接字段/表达式 |
返回值:
游标
示例:
|
A |
|
1 |
=demo.cursor("select * from EMPLOYEE order by EID" ) |
|
2 |
=demo.cursor("select * from PERFORMANCE order by EMPLOYEEID") |
|
3 |
=joinx(A1:EmployeeID1,EID;A2:EmployeeID2,EMPLOYEEID) |
常规连接,不匹配的项丢弃,每个字段值指向原游标的一条记录 |
4 |
=A3.fetch() |
|
5 |
=demo.cursor("select * from EMPLOYEE order by EID" ) |
|
6 |
=demo.cursor("select * from PERFORMANCE order by EMPLOYEEID") |
|
7 |
=joinx@f(A5:EmployeeID1,EID;A6: EmployeeID2,EMPLOYEEID) |
全连接,无匹配项的用null |
8 |
=A7.fetch() |
|
9 |
=demo.cursor("select * from EMPLOYEE order by EID" ) |
|
10 |
=demo.cursor("select * from PERFORMANCE order by EMPLOYEEID") |
|
11 |
=joinx@1(A9:EmployeeID2,EID-5;A10:EmployeeID1,EMPLOYEEID) |
左连接,以第一个游标为基准,无匹配项的用null |
12 |
=A11.fetch() |
|
13 |
=demo.cursor("select * from EMPLOYEE order by EID" ) |
|
14 |
=demo.cursor("select * from PERFORMANCE where EMPLOYEEID>3 order by EMPLOYEEID ") |
|
15 |
=joinx@p(A13:EmployeeID2;A14:EmployeeID1).fetch() |
按位置连接 |
16 |
=demo.query("select top 3 EID,NAME from EMPLOYEE") |
|
17 |
=A16.modify(2,2,null) |
|
18 |
=A16.cursor() |
|
19 |
=demo.cursor("select top 20 * from EMPLOYEE") |
|
20 |
=joinx(A18:Employee1,EID,NAME;A19: Employee2,EID,NAME) |
根据EID与NAME连接 |
21 |
=A20.fetch() |
|
22 |
=demo.query("select top 3 EID,NAME from EMPLOYEE").keys(EID) |
|
23 |
=A22.cursor() |
|
24 |
=demo.query("select top 20 * from EMPLOYEE").keys(EID) |
|
25 |
=A24.cursor() |
|
26 |
=joinx(A23:Employee1;A25: Employee2) |
使用主键连接 |
27 |
=A26.fetch() |
|
28 |
=demo.cursor("select * from EMPLOYEE" ) |
|
29 |
=demo.query("select * from PERFORMANCE") |
|
30 |
=joinx@u(A28:EmployeeID1,EID;A29:EmployeeID2,EMPLOYEEID) |
使用@u选项,只有A28是游标,其它是内存序表,此时不要求有序。
|
31 |
=A30.fetch() |
|
相关概念:
描述:
连接同分步的集群游标
语法:
joinx(csi:Fi,xi,..;…)
备注:
假定xi为升序,将同分步的多个集群游标csi按照关联字段/关联表达式xi和x1以相等的关系连接,产生以Fi,…为字段的集群游标。Fi为引用字段,引用原集群游标序列csi中的记录。xj参数全省略则使用主键连接。有xj参数没设置维时则使用xj的值连接。
支持集群多路游标,集群多路游标时路数必须相同。不管是多少个游标之间关联,都是和cs1中的x1相等判断,因此是一对多的关系。
注意:需要连接的数据在同一台分机上,不能跨机取数。
选项:
@f |
全连接,找不到匹配值时,则与null对应 |
@1 |
左连接(注意:这里是数字1,不是字母l) |
@p |
按位置连接,忽略xj参数 |
参数:
Fi |
结果字段名 |
csi |
用于连接的集群游标 |
xi |
连接字段/表达式 |
返回值:
同分布的集群游标
示例:
|
A |
B |
|
1 |
[192.168.0.114:8281,192.168.18.131:8281] |
|
两个集群分机 |
2 |
=file("salespart.ctx":[1], A1) |
=file("orderpart.ctx":[1], A1) |
组表salespart.ctx 与 orderpart.ctx 分布在两台集群分机中 |
3 |
=A2.open() |
=B2.open() |
打开集群组表 |
4 |
=A3.cursor() |
=B3.cursor() |
|
5 |
=B4.sortx(EID; A4) |
=joinx(A4:s,EID;A5:o,EID) |
在A5中将B4的结果数据排序,将排序的结果按照用户数据来同分布处理,生成与用户数据同分布的游标; B5中用joinx将两个同分布的游标连接 |
|
A |
|
1 |
=file("t1.ctx":[2],"192.168.0.111:8281") |
|
2 |
=A1.open() |
打开集群组表t1.ctx |
3 |
=A2.cursor@m(;;3) |
用集群组表生成路数为3的多路游标 |
4 |
=file("t2.ctx":[3],"192.168.0.111:8281") |
|
5 |
=A4.open() |
打开集群组表t2.ctx |
6 |
=A5.cursor(;;A3) |
根据A3返回的多路游标同步分段 |
7 |
=joinx(A3:t1,EID;A6:t2,EID).fetch() |
连接多路游标A3、A6,进行多线程计算 |
描述:
连接多个虚表
语法:
joinx(Ti:Fi,xj,..;…)
备注:
将虚表Ti,…通过xj相等的关系连接,xj参数全省略则使用主键连接。产生以为Fi,。。。字段的虚表,Fi为引用字段,引用原虚表Ti中的记录, 注意:xj…仅支持升序。
不管是多少个虚表之间关联,都是和T1中的x1相等判断,因此是一对多的关系
参数:
Ti |
用于连接的虚表 |
Fi |
结果虚表的字段名 |
xj |
连接字段/表达式 |
选项:
@f |
全连接,找不到匹配值时,则与null对应 |
@1 |
左连接(注意:这里是数字1,不是字母l) |
@p |
按位置连接,忽略xj参数 |
返回值:
虚表
示例:
|
A |
|
1 |
=file("emp6.ctx").open().pseudo() |
生成虚表,表中数据内容如下: |
2 |
=file("PERFORMANCE.ctx").open().pseudo() |
生成虚表,表中数据内容如下: |
3 |
=joinx(A1:EID,EID;A2:EMPLOYEEID,EMPLOYEEID) |
常规连接,不匹配的项丢弃,每个字段值指向原游标的一条记录 |
4 |
=A3.import() |
|
5 |
=joinx(A1:EID;A2:EMPLOYEEID) |
连接字段缺省使用主键连接,结果同上 |
6 |
=A5.import() |
|
7 |
=joinx@f(A1:EID;A2:EMPLOYEEID) |
全连接,无匹配项的用null |
8 |
=A7.import() |
|
9 |
=joinx@1(A1:EID;A2:EMPLOYEEID) |
左连接,以第一个虚表为基准,无匹配项的用null |
10 |
=A9.import() |
|
11 |
=joinx@p(A1:EID;A2:EMPLOYEEID) |
按位置连接 |
12 |
=A11.cursor().fetch() |
|
描述:
游标与可分段集文件外键式连接
语法:
cs.joinx(C:…,f:K:…,x:F,…;…;…;n)
备注:
用游标cs中的字段C,…匹配可分段集文件f的键K找到相应记录,然后拼接上该记录的表达式x作为字段F添加到cs中形成新游标。匹配不上外键的记录,字段值缺省填写为null。 f对K有序。
选项:
@i |
外键匹配不上的,删除此外键的整条记录 |
@o(F;…) |
原记录整个作为字段F生成新记录,x可以是~,表示T的整条记录 |
@d |
没有x:F参数时,做与@i相反的过滤动作 |
@q |
cs数据量不大或是序列时,有序匹配加快速度 |
@c |
cs对第一套C:…有序时,可加快速度,可与@q配合 |
@u |
不保持cs的原次序,可加快速度 |
参数:
cs |
游标/多路游标 |
C |
游标cs的外键 |
f |
集文件 |
K |
f的键,K为#时理解为序号 |
x |
f的字段表达式 |
F |
表达式x的字段名 |
n |
缓存区行数 |
返回值:
游标
示例:
|
A |
|
1 |
=demo.cursor("select EID,NAME,DEPT,SALARY from EMPLOYEE where EID<10 order by EID" ) |
返回取数游标,数据内容如下: |
2 |
=file("D:\\joinx.btx") |
返回集文件,文件中数据如下: |
3 |
=A1.joinx(EID,A2:EMPLOYEEID,BONUS+1:SALARY1) |
常规连接,匹配不上的外键的用null |
4 |
=A3.fetch() |
|
5 |
=A1.joinx@i(EID,A2:EMPLOYEEID,BONUS+1:SALARY1;5) |
匹配不上的外键删除整条记录 |
6 |
=A5.fetch() |
|
7 |
=A1.joinx@i(EID,A2:EMPLOYEEID;5) |
在@i选项中没有x:F参数时,结果如下 |
8 |
=A7.fetch() |
|
9 |
=A1.joinx@o(F1;EID,A2:EMPLOYEEID,BONUS+1:SALARY1;5) |
原记录整个作为字段F1 |
10 |
=A9.fetch() |
|
11 |
=A1.joinx@o(F1;EID,A2:EMPLOYEEID,~:SALARY1;5) |
使用~代替x参数 |
12 |
=A11.fetch() |
|
13 |
=A1.joinx@d(EID,A2:EMPLOYEEID;5) |
没有x:F参数时,保留匹配不上的外键记录 |
14 |
=A13.fetch() |
|
15 |
=A1.joinx@q(EID,A2:EMPLOYEEID,BONUS+1:SALARY1;5) |
有序的读出f相应记录匹配 |
16 |
=A15.fetch() |
|
16 |
=A1.joinx(EID,A2:#1,BONUS+1:SALARY1) |
#1表示序号为1的字段,即EMPLOYEEID |
17 |
=A16.fetch() |
|
18 |
=file("D:\\emp1.btx") |
|
19 |
=A1.joinx@qc(EID:DEPT,A18:EID:DEPT,STATE:EMPSTATE;5) |
使用@qc加速读出匹配的记录 |
描述:
游标与实表外键式连接。
语法:
cs.joinx(C:…,T:K:…,x:F,…;…;…;n)
备注:
用游标cs中的字段C,…匹配实表T的键K并找到相应记录,然后拼接上该记录的表达式x作为字段F添加到cs中形成新游标,匹配不上外键的记录,字段值缺省填写为null。 T对K有序,n是缓存区行数。
选项:
@i |
外键匹配不上的,删除此外键的整条记录 |
@o(F;…) |
原记录整个作为字段F生成新记录,x可以是~ |
@d |
没有x:F参数时,做与@i相反的过滤动作 |
@q |
cs数据量不大或是序列时,用这个选项会加速 |
@c |
cs对第一套C:…有序时,可利用此特性加快速度,可与@q配合 |
@u |
不保持cs的原次序,可加快速度 |
参数:
cs |
游标/多路游标 |
C |
游标cs的外键 |
T |
实表/组表游标 |
K |
T的键,K为#时理解为序号 |
x |
f的字段表达式 |
F |
表达式x的字段名 |
n |
缓存区行数 |
返回值:
游标
示例:
|
A |
|
1 |
=demo.cursor("select EID,NAME,DEPT,SALARY from EMPLOYEE where EID<10 order by EID" ) |
返回取数游标,数据内容如下: |
2 |
=file("D:\\PERFORMANCE3.ctx") |
|
3 |
=A2.create() |
打开实表,文件中数据如下: |
4 |
=A1.joinx(EID,A3:EMPLOYEEID,BONUS+1:SALARY1;5) |
常规连接,匹配不上的外键的用null |
5 |
=A4.fetch() |
|
6 |
=A1.joinx@i(EID,A3:EMPLOYEEID,BONUS+1:SALARY1;5) |
匹配不上的外键删除整条记录 |
7 |
=A6.fetch() |
|
8 |
=A1.joinx@d(EID,A3:EMPLOYEEID;5) |
没有x:F参数时,保留匹配不上的外键记录 |
9 |
=A8.fetch() |
|
10 |
=A1.joinx@o(F1;EID,A3:EMPLOYEEID,BONUS+1:SALARY1;5) |
原记录整个作为字段F1 |
11 |
=A10.fetch() |
|
12 |
=A1.joinx@o(F1;EID,A3:EMPLOYEEID,~:SALARY1;5) |
使用~代替x参数 |
13 |
=A12.fetch() |
|
14 |
=A1.joinx@q(EID,A3:EMPLOYEEID,BONUS+1:SALARY1;5) |
快速读出T相应记录匹配 |
15 |
=A14.fetch() |
|
16 |
=demo.cursor("select * from PERFORMANCE") |
返回游标 |
17 |
=file("D:/employees.ctx").create().cursor() |
返回组表游标 |
18 |
=A16.joinx(EMPLOYEEID,A17:EID,Name).fetch() |
游标与组表游标外键式连接 |
19 |
=A1.joinx(EID,A3:#1,BONUS+1:SALARY1;5) |
#1表示序号为1的字段,即EMPLOYEEID |
20 |
=A19.fetch() |
|
21 |
=file("D:\\emp1.ctx") |
|
22 |
=A21.create() |
|
23 |
=A1.joinx@qc(EID:DEPT,A22:EID:DEPT,STATE:EMPSTATE;5) |
使用@qc加速读出匹配的记录 |
描述:
管道与集文件/实表外键式连接
语法:
ch.joinx(C:…,f:K:…,x:F,…;…;…;n) 用管道ch中的字段C,…匹配可分段集文件f的键K并找到相应记录
ch.joinx(C:…,T:K:…,x:F,…;…;…;n) 用管道ch中的字段C,…匹配实表T的键K并找到相应记录
备注:
用管道ch中的字段C,…匹配可分段集文件f或者实表T的键K并找到相应记录,然后拼接上该记录的表达式x作为字段F添加到ch中形成新管道,匹配不上外键的记录,字段值缺省填写为null。 f/T对K有序,n是缓存区行数。
选项:
@i |
外键匹配不上的,删除此外键的整条记录 |
@o(F;…) |
原记录整个作为字段F生成新记录,x可以是~ |
@d |
没有x:F参数时,做与@i相反的过滤动作 |
@q |
ch数据量不大或是序列时,有序匹配加快速度 |
@c |
ch对第一套C:…有序时,可加快速度,可与@q配合 |
@u |
不保持ch的原次序 |
参数:
ch |
管道 |
C |
管道ch的外键 |
f |
集文件 |
T |
实表 |
K |
f/T的键 |
x |
f的字段表达式 |
F |
表达式x的字段名 |
n |
缓存区行数 |
返回值:
管道
示例:
集文件:
|
A |
|
1 |
=demo.cursor("select EID,NAME,DEPT,SALARY from EMPLOYEE where EID<10 order by EID" ) |
返回取数游标,数据内容如下: |
2 |
=file("D:\\joinx.btx") |
返回集文件,文件中数据如下: |
3 |
=channel() |
创建管道 |
4 |
=channel() |
|
5 |
=channel() |
|
6 |
=channel() |
|
7 |
=channel() |
|
8 |
=channel() |
|
9 |
=A1.push(A3,A4,A5,A6,A7,A8) |
将游标A1接到管道A3、A4、 A5、 A6、A7和A8,此时数据不会立马被推送到管道 |
10 |
=A3.joinx(EID,A2:EMPLOYEEID,BONUS+1:SALARY1;5) |
常规连接,匹配不上的外键的用null |
11 |
=A4.joinx@i(EID,A2:EMPLOYEEID,BONUS+1:SALARY1;5) |
匹配不上的外键删除整条记录 |
12 |
=A5.joinx@o(F1;EID,A2:EMPLOYEEID,BONUS+1:SALARY1;5) |
原记录整个作为字段F1 |
13 |
=A6.joinx@o(F1;EID,A2:EMPLOYEEID,~:SALARY1;5) |
使用~代替x参数 |
14 |
=A7.joinx@d(EID,A2:EMPLOYEEID;5) |
没有x:F参数时,保留匹配不上的外键记录 |
15 |
=A8.joinx@q(EID,A2:EMPLOYEEID,BONUS+1:SALARY1;5) |
有序的读出f相应记录匹配 |
16 |
=A1.fetch() |
将游标A1的数据推送到管道 |
17 |
=A3.result().fetch() |
|
18 |
=A4.result().fetch() |
|
19 |
=A5.result().fetch() |
|
20 |
=A6.result().fetch() |
|
21 |
=A7.result().fetch() |
|
22 |
=A8.result().fetch() |
|
24 |
=file("D:\\emp.btx") |
|
25 |
=channel() |
|
26 |
=A1.push(A25) |
|
27 |
=A25.joinx@qc(DEPT:EID,A24:EID:DEPT,SALARY+1:SALARY1;5) |
使用@qc加速读出匹配的记录 |
实表:
|
A |
|
1 |
=demo.cursor("select EID,NAME,DEPT,SALARY from EMPLOYEE where EID<10 order by EID" ) |
返回取数游标,数据内容如下: |
2 |
=file("D:\\PERFORMANCE3.ctx") |
|
3 |
=A2.create() |
打开实表,文件中数据如下: |
4 |
=channel() |
创建管道 |
5 |
=channel() |
|
6 |
=channel() |
|
7 |
=channel() |
|
8 |
=channel() |
|
9 |
=channel() |
|
10 |
=A1.push(A4,A5,A6,A7,A8,A9) |
将游标A1接到管道A3、A4、 A5、 A6、A7和A8,此时数据不会立马被推送到管道 |
11 |
=A4.joinx(EID,A3:EMPLOYEEID,BONUS+1:SALARY1;5) |
常规连接,匹配不上的外键的用null |
12 |
=A5.joinx@i(EID,A3:EMPLOYEEID,BONUS+1:SALARY1;5) |
匹配不上的外键删除整条记录 |
13 |
=A6.joinx@o(F1;EID,A3:EMPLOYEEID,BONUS+1:SALARY1;5) |
原记录整个作为字段F1 |
14 |
=A7.joinx@o(F1;EID,A3:EMPLOYEEID,~:SALARY1;5) |
使用~代替x参数 |
15 |
=A8.joinx@d(EID,A3:EMPLOYEEID;5) |
没有x:F参数时,保留匹配不上的外键记录 |
16 |
=A9.joinx@q(EID,A3:EMPLOYEEID,BONUS+1:SALARY1;5) |
有序的读出实表相应记录匹配 |
17 |
=A1.fetch() |
将游标A1的数据推送到管道 |
18 |
=A4.result().fetch() |
|
19 |
=A5.result().fetch() |
|
20 |
=A6.result().fetch() |
|
21 |
=A7.result().fetch() |
|
22 |
=A8.result().fetch() |
|
23 |
=A9.result().fetch() |
|
24 |
=file("D:\\emp.ctx") |
|
25 |
=A24.create() |
|
26 |
=channel() |
|
27 |
=A1.push(A26) |
|
28 |
=A26.joinx@qc(DEPT:EID,A25:EID:DEPT,SALARY+1:SALARY1;5) |
使用@qc加速读出匹配的记录 |