本章介绍join()函数的多种用法。
描述:
多序列连接
语法:
join(Ai:Fi,xj,..;…)
备注:
将多个序列Ai按照关联字段/关联表达式xj和x1相等的关系连接,产生以Fi,…为字段的序表,Fi赋值为Ai对应成员,引用原排列Ai中的记录,xj全省略时用Ai的主键。某个xj 省略时该项条件不必匹配。
不管是多少个排列之间关联,都是和A1中的x1相等判断,因此是一表对多表的关系。
选项:
@f |
全连接,找不到匹配值时,则与null对应 |
@1 |
左连接(注意:这里是数字1,不是字母l) |
@m |
假定所有Ai针对xj,…有序,则用归并法计算 |
@p |
按位置连接,忽略xj参数 |
@i |
仅用于过滤A1,忽略Fi参数,与@f@1互斥 |
@d |
仅用于过滤A1,只保留找不到的,忽略Fi参数,与@f@1互斥 |
参数:
Fi |
结果序表的字段名 |
Ai |
被连接的序列或排列 |
xj |
连接字段/表达式 |
返回值:
所有字段均为引用字段的新序表
示例:
|
A |
|
1 |
=demo.query("select top 3 EID,NAME from EMPLOYEE").keys(EID) |
|
2 |
=demo.query("select top 3 EID,NAME from FAMILY").keys(EID) |
|
3 |
=join(A1:Employee,EID;A2:Familymembers,EID) |
常规连接,不匹配的项丢弃,每个字段值都是ref字段,指向原序表的一条记录 |
4 |
=join@f(A1:Employee,EID;A2:Familymembers,EID) |
全连接,无匹配项的用null |
5 |
=join@1(A1:Employee,EID;A2:Familymembers,EID) |
左连接,以第一个序表为基准,无匹配项的用null |
6 |
=join@m(A1:Employee,EID;A2:Familymembers,EID) |
假定所有关联字段同序,用归并法计算;如果不同序则会出错 |
7 |
=join@p(A1:Employee;A2:Familymembers) |
|
9 |
=join(A1:Employee;A2:Familymembers) |
|
10 |
=join(A1:Employee1;A2:Familymembers1) |
|
11 |
=join(A7:Employee2;A8:Familymembers2) |
|
12 |
=join@i(A1;A2) |
过滤A1,保留找到的 |
13 |
=join@d(A1;A2) |
过滤A1,保留找不到的 |
相关概念:
描述:
序表与排列外键式连接
语法:
A.join(C:.,T:K,x:F,…; …;…)
备注:
用序表/排列A的字段C,…匹配序表/排列T的键找到相应记录,在A上拼接T中的表达式x,作为字段F添加到A 上形成新序表。K只能省略或是#,K省略时用T的键,用#时表示用序号。如果F在A中已存在则改写现有字段。时间键值被省略时用now()。
选项:
@i |
匹配不上的外键删除整条记录,缺省将填成null。当参数x:F省略时,只做针对A的过滤操作。 |
@o(F;…) |
原记录整个作为字段F生成新记录,此时相当于x为~ |
@d |
当参数x:F省略时,删除匹配上外键的整条记录,只做针对A的过滤操作。 |
@k |
当x是~时,在结果序表中记录F和C:…对应关系用于识别预关联外键 |
@m |
A对C有序,T对K有序,此时可用归并方式计算 |
参数:
A |
序表/排列 |
C |
A的外键,多个时以冒号隔开 |
T |
序表/排列/内表 |
K |
T的键 |
x |
T的字段表达式,x可以是~和#,#表示记录在T中的序号,找不到填为0 |
F |
表达式x的字段名 |
返回值:
序表/排列
示例:
|
A |
|
1 |
=demo.query("select * from EMPLOYEE order by EID" ) |
|
2 |
=demo.query("select * from PERFORMANCE order by EMPLOYEEID").keys(EMPLOYEEID) |
|
3 |
=demo.query("select * from PERFORMANCE order by EMPLOYEEID").cursor().memory().keys(EMPLOYEEID) |
返回内表 |
4 |
=A1.join(EID,A2,BONUS+1:SALARY1) |
外键匹配不上的用null |
5 |
=A1.join(EID,A3,BONUS+1:SALARY1) |
A3为内表,结果同上,外键匹配不上的用null |
6 |
=A1.join@i(EID,A2,BONUS+1:SALARY1) |
匹配不上的外键删除整条记录 |
7 |
=A1.join@i(EID,A2:#1,BONUS+1:SALARY1) |
结果同A4, #1表示第1个字段 |
8 |
=A1.join@o(F1;EID,A2,BONUS+1:SALARY1) |
原记录整个作为字段F1 |
9 |
=A1.join@i(EID,A2) |
省略参数x:F时,只做针对A1的过滤操作 |
10 |
=A1.join@d(EID,A2) |
省略参数x:F时,删除外键可以匹配上的记录,只做针对A1的过滤操作 |
11 |
=A1.join(EID,A2,BONUS+1:SALARY) |
SALARY在A1中已存在则改写现有字段 |
描述:
管道与排列外键式连接
语法:
ch.join(C:.,T:K,x:F,…; …;…)
备注:
用管道ch中的字段C,…匹配序表/排列T的键找到相应记录,在ch上拼接T中的表达式x,作为字段F添加到ch上形成管道。K只能省略或是#,K省略时用T的键,用#时表示用序号。
选项:
@i |
匹配不上的外键删除整条记录,缺省将填成null |
@o(F;…) |
原记录整个作为字段F生成新记录,x可以是~ |
参数:
ch |
管道 |
C |
管道ch的外键,多个时以冒号隔开 |
T |
序表/排列 |
K |
T的键 |
x |
T的字段表达式 |
F |
表达式x的字段名 |
返回值:
管道
示例:
|
A |
|
1 |
=demo.cursor("select EID,NAME,SALARY from EMPLOYEE order by EID" ) |
|
2 |
=demo.query("select * from PERFORMANCE order by EMPLOYEEID").keys(EMPLOYEEID) |
|
3 |
=channel() |
创建管道 |
4 |
=channel() |
|
5 |
=channel() |
|
6 |
=channel() |
|
7 |
=A1.push(A3,A4,A5,A6) |
将游标A1中的数据推送到管道A3、A4、A5和A6,此时数据不会立即被推送到管道。 |
8 |
=A3.join(EID,A2, BONUS+1:SALARY1) |
常规连接,匹配不上的外键的用null |
9 |
=A8.fetch() |
保留管道当前数据 |
10 |
=A4.join@i(EID,A2: #1, #3+1:SALARY1) |
#1表示第1个字段,#3表示第3个字段 |
11 |
=A10.fetch() |
|
12 |
=A5.join@i(EID,A2, BONUS+1:SALARY1) |
匹配不上的外键删除整条记录 |
13 |
=A12.fetch() |
|
14 |
=A6.join@o(F1;EID,A2,~.BONUS+1:SALARY1) |
原记录整个作为字段F1 |
15 |
=A14.fetch() |
|
16 |
=A1.fetch() |
|
17 |
=A3.result() |
|
18 |
=A4.result() |
|
19 |
=A5.result() |
结果同A18 |
20 |
=A6.result() |
|
描述:
游标与排列外键式连接
语法:
cs.join(C:.,T:K,x:F,…; …;…)
备注:
用游标cs中的字段C,…匹配T的键找到相应记录,在cs上拼接T中的表达式x,作为字段F添加到cs上,返回原游标。K只能省略或是#,K省略时用T的键,用#时表示用序号,支持多路游标。
选项:
@i |
匹配不上的外键删除整条记录,缺省将填成null |
@o(F;…) |
原记录整个作为字段F生成新记录,x可以是~,表示T的整条记录 |
@d |
当参数x:F省略时,删除匹配上外键的整条记录,只做针对cs的过滤操作。 |
@m |
A对C有序,T对K有序,此时可用归并方式计算 |
参数:
cs |
游标/多路游标 |
C |
游标cs的外键,多个时以冒号隔开 |
T |
序表/排列 |
K |
T的键 |
x |
T的字段表达式 |
F |
表达式x的字段名 |
返回值:
原游标cs
示例:
|
A |
|
1 |
=demo.cursor("select EID,NAME,DEPT,SALARY from EMPLOYEE where EID<10 order by EID" ) |
返回取数游标,数据内容如下: |
2 |
=demo.query("select * from PERFORMANCE order by EMPLOYEEID").keys(EMPLOYEEID) |
返回序表: |
3 |
=A1.join(EID,A2, BONUS+1:SALARY1) |
常规连接,匹配不上的外键的用null |
4 |
=A3.fetch() |
|
5 |
=demo.cursor("select EID,NAME,DEPT,SALARY from EMPLOYEE where EID<10 order by EID" ) |
同A1 |
6 |
=demo.query("select * from PERFORMANCE order by EMPLOYEEID").keys(EMPLOYEEID) |
同A2 |
7 |
=A5.join@i(EID,A6, BONUS+1:SALARY1) |
匹配不上的外键删除整条记录 |
8 |
=A7.fetch() |
|
9 |
=demo.cursor("select EID,NAME,DEPT,SALARY from EMPLOYEE where EID<10 order by EID" ) |
同A1 |
10 |
=demo.query("select * from PERFORMANCE order by EMPLOYEEID").keys(EMPLOYEEID) |
同A2 |
11 |
=A9.join@i(EID,A10: #1, #3+1:SALARY1) |
#1表示第1个字段,#3表示第3个字段 |
12 |
=A11.fetch() |
结果同A8 |
13 |
=demo.cursor("select EID,NAME,DEPT,SALARY from EMPLOYEE where EID<10 order by EID" ) |
同A1 |
14 |
=demo.query("select * from PERFORMANCE order by EMPLOYEEID").keys(EMPLOYEEID) |
同A2 |
15 |
=A13.join@o(F1;EID,A14,BONUS+1:SALARY1) |
原记录整个作为字段F1 |
16 |
=A15.fetch() |
|
17 |
=demo.cursor("select EID,NAME,DEPT,SALARY from EMPLOYEE where EID<10 order by EID" ) |
同A1 |
18 |
=demo.query("select * from PERFORMANCE order by EMPLOYEEID").keys(EMPLOYEEID) |
同A2 |
19 |
=A17.join@o(F1;EID,A18,~:SALARY1) |
使用~代替x参数 |
20 |
=A19.fetch() |
|
21 |
=demo.cursor("select EID,NAME,DEPT,SALARY from EMPLOYEE where EID<10 order by EID" ) |
同A1 |
22 |
=A21.join@d(EID,A2) |
使用@d选项,省略参数x:F,删除匹配上外键的整条记录 |
23 |
|
相关概念:
描述:
集群游标与排列外键式连接
语法:
cs.join(C:.,T:K,x:F,…; …;…)
备注:
用游标cs中的字段C,…匹配T的键找到相应记录,在cs上拼接T中的表达式x,作为字段F添加到cs上,返回原游标。K只能省略或是#,K省略时用T的键,用#时表示用序号,支持多路游标。
选项:
@c |
集群表有分布时,计算也均不做跨机引用,认为引用记录总在本机 |
参数:
cs |
游标/多路游标/集群游标 |
C |
游标cs的外键,多个时以冒号隔开 |
T |
集群内表 |
K |
T的键 |
x |
T的字段表达式 |
F |
表达式x的字段名 |
返回值:
原游标cs
示例:
|
A |
|
1 |
[192.168.18.143:8281] |
|
2 |
=file("emp_1.ctx":[2], A1) |
|
3 |
=A2.open() |
|
4 |
=A3.cursor() |
集群游标 |
5 |
[192.168.0.110:8281] |
|
6 |
=file("PERFORMANCE.ctx":[1],A5) |
|
7 |
=A6.open() |
|
8 |
=A7.cursor() |
|
9 |
=A8.memory() |
集群内表 |
10 |
=A4.join(EID,A9:EMPLOYEEID, BONUS*12:total) |
用集群游标中的字段EID匹配集群内表中的键EMPLOYEEID,并将集群内表中的表达式BONUS*12作为字段total 拼接到集群游标中,结果返回原游标 |
11 |
=A10.fetch() |
取游标中的数据: |
描述:
内表与序表/内表外键式连接
T.join(C:., Ai:K,x:F,…; …;…)
备注:
用内表T中的字段C,…匹配Ai 的键找到相应记录,在T上拼接Ai 中的表达式x,作为字段F添加到T上。K只能省略或是#,K省略时用Ai 的键,用#时表示用序号。
选项:
@i |
匹配不上的外键删除整条记录,缺省将填成null。当参数x:F省略时,只做针对Ai的过滤操作。 |
@o(F;…) |
原记录整个作为字段F生成新记录,此时相当于x为~ |
@d |
当参数x:F省略时,删除匹配上外键的整条记录,只做针对Ai的过滤操作。 |
@k |
当x是~时,在结果序表中记录F和C:…对应关系用于识别预关联外键 |
参数:
T |
内表 |
C |
T的外键,多个时以冒号隔开 |
Ai |
序表/内表 |
K |
Ai的键 |
x |
Ai的字段表达式 |
F |
表达式x的字段名 |
返回值:
序表
示例:
|
A |
|
1 |
=connect("demo").cursor("select EID,NAME,DEPT,SALARY from EMPLOYEE where EID<10 order by EID" ) |
|
2 |
=A1.memory() |
返回内表 |
3 |
=connect("demo").query("select * from PERFORMANCE order by EMPLOYEEID").keys(EMPLOYEEID) |
返回键为EMPLOYEEID的序表 |
4 |
=A2.join(EID,A3, BONUS*2:ALL_SALARY) |
内表与序表外键式连接,外键匹配不上的用null
|
5 |
=A2.join@i(EID,A3, #3:ALL_SALARY) |
使用@i选项,外键匹配不上的删除整条记录,#3表示第3个字段 |
6 |
=A2.join@i(EID,A3) |
使用@i选项,外键匹配不上的删除整条记录,参数x:F省略,只做针对序表A3的过滤操作 |
7 |
=A2.join@d(EID,A3) |
使用@d选项,删除匹配上外键的整条记录,省略参数x:F,只做针对序表A3的过滤操作 |
8 |
=A2.join@o(emp;EID,A3, BONUS*2:ALL_SALARY) |
使用@o选项,内表A2原记录整个作为字段emp生成新记录
|
9 |
=A2.join@k(EID,A3, ~:ALL_SALARY) |
使用@k选项,当参数x是~时,在结果序表中记录ALL_SALARY和EID对应关系用于识别预关联外键 |
10 |
=connect("demo").cursor("select * from PERFORMANCE order by EMPLOYEEID").memory().keys(EMPLOYEEID) |
返回键为EMPLOYEEID的内表 |
11 |
=A2.join(EID,A10, BONUS*2:ALL_SALARY) |
内表A2与内表A10外键式连接 |