joinx()

阅读(673) 标签: joinx,

本章介绍join()函数的多种用法。

joinx()

描述:

连接游标对应的序表

语法:

joinx(csi:Fi,xj,..;…)

备注:

针对有序游标csi的结果集做join@m,返回新游标,xj参数全省略则使用主键连接. xj参数没主键则使用xj的值连接。支持多路游标,多路游标时必须路数相同。csi也可以是序表。

假定xj 有序,将多个游标csi按照关联字段/关联表达式xjx1相等的关系连接,产生以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)

根据EIDNAME连接

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()

相关概念:

join()

joinx()

描述:

连接同分步的集群游标

语法:

joinx(csi:Fi,xi,..;…)

备注:

假定xi升序将同分步的多个集群游标csi按照关联字段/关联表达式xix1以相等的关系连接,产生以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()

连接多路游标A3A6,进行多线程计算

 

joinx()

描述:

连接多个虚表

语法:

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()

描述:

游标与可分段集文件外键式连接

语法:

cs.joinx(C:…,f:K:…,x:F,…;…;…;n)

备注:

用游标cs中的字段C,匹配可分段集文件f的键K找到相应记录,然后拼接上该记录的表达式x作为字段F添加到cs中形成新游标匹配不上外键的记录,字段值缺省填写为null fK有序。

选项:

@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()

描述:

游标与实表外键式连接。

语法:

cs.joinx(C:…,T:K:…,x:F,…;…;…;n)

备注:

用游标cs中的字段C,匹配实表T的键K并找到相应记录,然后拼接上该记录的表达式x作为字段F添加到cs中形成新游标匹配不上外键的记录,字段值缺省填写为null TK有序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()

描述:

管道与集文件/实表外键式连接

语法:

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/TK有序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接到管道A3A4 A5 A6A7A8,此时数据不会立马被推送到管道

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接到管道A3A4 A5 A6A7A8,此时数据不会立马被推送到管道

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加速读出匹配的记录