join()

阅读(1638) 标签: join,

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

join()

描述:

多序列叉乘

语法:

join(Ai:Fi,xj,..;…)

备注:

将多个序列Ai按照关联字段/关联表达式xjx1相等的关系叉乘,产生以Fi,…为字段的序表,Fi为引用字段,引用原排列Ai中的记录,xj全省略时用Ai的主键。某个xj 省略时该项条件不必匹配。

不管是多少个排列之间关联,都是和A1中的x1相等判断,因此是一表对多表的关系。

选项:

@f

全连接,找不到匹配值时,则与null对应

@1

左连接(注意:这里是数字1,不是字母l

@m

假定所有Ai针对xj,…有序,则用归并法计算

@p

按位置连接,忽略xj参数

@x

Ai的字段取值都是记录时,字段值将被展开

参数:

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@x(A7:Employee2;A8:Familymembers2)

Ai的字段取值都是记录时,字段值将被展开

相关概念:

xjoin()

A.join()

描述:

序表与排列外键式连接

语法:

A.join(C:.,T:K,x:F,…; …;…)

备注:

用序表/排列A的字段C,匹配序表/排列T的键找到相应记录,在A上拼接T中的表达式x作为字段F添加到A 上形成新序表。K只能省略或是#K省略时用T的键,用#时表示用序号。

选项:

@i

匹配不上的外键删除整条记录,缺省将填成null当参数x:F省略时,只做针对A的过滤操作。

@o(F;)

原记录整个作为字段F生成新记录,此时相当于x~

@d

当参数x:F省略时,删除匹配上外键的整条记录,只做针对A的过滤操作。

@k

x~时,在结果序表中记录FC:…对应关系用于识别预关联外键

参数:

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的过滤操作

ch.join()

描述:

管道与排列外键式连接

语法:

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中的数据推送到管道A3A4A5A6,此时数据不会立即被推送到管道。

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

描述:

游标与排列外键式连接

语法:

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的过滤操作。

参数:

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

=file("D:\\test7.ctx")

 

22

=A21.create(#EMPLOYEEID,EVALUATION,BONUS;EMPLOYEEID

创建组表

23

=A22.attach(table3,#EMPLOYEEID,EVALUATION,BONUS)

增加附表

24

=demo.cursor("select * from PERFORMANCE")

附加记录

25

=A23.append(A24)

附加记录

26

=demo.cursor("select EID,NAME,DEPT,SALARY from EMPLOYEE where EID<10 order by  EID" )

 

相关概念:

join()

cs.join ()

描述:

集群游标与排列外键式连接

语法:

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", A1)

 

3

=A2.create()

 

4

=A3.cursor()

集群游标

5

[192.168.0.110:8281]

 

6

=file("PERFORMANCE.ctx",A5)

 

7

=A6.create()

 

8

=A7.cursor()

 

9

=A8.memory()

集群内表

10

=A4.join(EID,A9:EMPLOYEEID, BONUS*12:total)

用集群游标中的字段EID匹配集群内表中的键EMPLOYEEID,并将集群内表中的表达式BONUS*12作为字段total 拼接到集群游标中,结果返回原游标

11

=A10.fetch()

取游标中的数据: