本章介绍joinx()函数的多种用法。
描述:
连接游标对应的序表。
语法:
joinx(csi:Fi,xj,..;…)
备注:
针对有序游标csi的结果集使用归并法计算,返回新游标。
xj参数全省略则使用主键连接。有xj参数没主键则使用xj的值连接。支持多路游标,此时必须路数相同。csi也可以是序表。
假定xj 有序,将多个游标csi按照关联字段/关联表达式xj和x1相等的关系连接,产生以Fi,…为字段的游标。Fi为引用字段,引用原游标序列csi中的记录。注意:xj…仅支持升序。
不管是多少个游标之间关联,都是和cs1中的x1相等判断,因此是一对多的关系。
该函数属于延迟计算函数。
选项:
@f |
全连接,找不到匹配值时,则与null对应。 |
@1 |
左连接(注意:这里是数字1,不是字母l)。 |
@p |
按位置连接,忽略xj参数。 |
@i |
仅用于过滤cs1,忽略Fi参数,与@f@1互斥。 |
@d |
仅用于过滤cs1,只保留找不到的,忽略Fi参数,与@f@1互斥。 |
@u |
只有cs1是游标,其它都是内存序表,此时不要求有序。 |
参数:
Fi |
结果序表的字段名。 |
csi |
用于连接的游标或序表。 |
xj |
连接字段/表达式。 |
返回值:
游标
示例:
使用主键连接:
|
A |
|
1 |
=demo.query("select top 10 EID,NAME,DEPT,GENDER from EMPLOYEE " ).keys(EID).cursor() |
返回游标,游标中的表主键为EID,数据内容如下:
|
2 |
=demo.query("select top 10 EID,NAME,RELATION,GENDER,AGE from FAMILY " ).keys(EID) |
返回EID为键的序表,数据内容如下:
|
3 |
=joinx(A1:Emp;A2:Family) |
使用主键连接。 |
4 |
=A3.fetch() |
读取A3游标中的数据:
|
使用@f选项,全连接:
|
A |
|
1 |
=demo.cursor("select EID,NAME,DEPT,GENDER from EMPLOYEE where EID>2 and EID<10" ) |
返回游标,数据内容如下:
|
2 |
=demo.query("select top 10 EID,NAME,RELATION,GENDER,AGE from FAMILY " ) |
返回游标,数据内容如下:
|
3 |
=joinx@f(A1:Emp,EID;A2:Family,EID) |
使用@f选项,全连接,无匹配项的用null。 |
4 |
=A3.fetch() |
读取A3游标中的数据:
|
使用@1选项,左连接:
|
A |
|
1 |
=demo.cursor("select EID,NAME,DEPT,GENDER from EMPLOYEE where EID>2 and EID<10" ) |
返回游标,数据内容如下:
|
2 |
=demo.query("select top 10 EID,NAME,RELATION,GENDER,AGE from FAMILY " ) |
返回游标,数据内容如下:
|
3 |
=joinx@1(A1:Emp,EID;A2:Family,EID) |
使用@1选项,左连接,以第一个游标为基准,无匹配项的用null。 |
4 |
=A3.fetch() |
读取A3游标中的数据:
|
使用@p选项,按位置连接:
|
A |
|
1 |
=demo.cursor("select EID,NAME,DEPT,GENDER from EMPLOYEE where EID>2 and EID<10" ) |
返回游标,数据内容如下:
|
2 |
=demo.query("select top 10 EID,NAME,RELATION,GENDER,AGE from FAMILY " ) |
返回游标,数据内容如下:
|
3 |
=joinx@p(A1:Emp,EID;A2:Family,EID) |
使用@p选项,按位置连接。 |
4 |
=A3.fetch() |
读取A3游标中的数据:
|
使用@i选项,仅用于过滤:
|
A |
|
1 |
=demo.cursor("select top 10 EID,NAME,DEPT,GENDER from EMPLOYEE" ).sortx(DEPT) |
返回游标,数据内容如下:
|
2 |
=demo.query("select top 5 * from DEPARTMENT " ).sort(DEPT) |
返回序表内容如下:
|
3 |
=joinx@i(A1,DEPT;A2,DEPT) |
使用@i选项,过滤A1游标,能匹配上A2的记录保留。 |
4 |
=A3.fetch() |
读取A3游标中的数据:
|
使用@d选项,仅用于过滤,与@i结果相反:
|
A |
|
1 |
|
返回游标,数据内容如下:
|
2 |
=demo.query("select top 5 * from DEPARTMENT " ).sort(DEPT) |
返回序表内容如下:
|
3 |
=joinx@d(A1,DEPT;A2,DEPT) |
使用@d选项,过滤A1游标,不能匹配上A2的记录保留。 |
4 |
=A3.fetch() |
读取A3游标中的数据:
|
描述:
连接同分步的集群游标。
语法:
joinx(csi:Fi,xi,..;…)
备注:
假定xi为升序,将同分布的多个集群游标csi按照关联字段/关联表达式xi和x1以相等的关系连接,产生以Fi,…为字段的集群游标。Fi为引用字段,引用原集群游标序列csi中的记录。xj参数全省略则使用主键连接。有xj参数没设置维时则使用xj的值连接。
支持集群多路游标,集群多路游标时路数必须相同。不管是多少个游标之间关联,都是和cs1中的x1相等判断,因此是一对多的关系。
注意:需要连接的数据在同一台分机上,不能跨机取数。
选项:
@f |
全连接,找不到匹配值时,则与null对应。 |
@1 |
左连接(注意:这里是数字1,不是字母l)。 |
@p |
按位置连接,忽略xj参数。 |
@i |
仅用于过滤cs1,忽略Fi参数,与@f@1互斥。 |
@d |
仅用于过滤cs1,只保留找不到的,忽略Fi参数,与@f@1互斥。 |
参数:
Fi |
结果字段名。 |
csi |
用于连接的集群游标。 |
xi |
连接字段/表达式。 |
返回值:
集群游标
示例:
|
A |
B |
|
1 |
[192.168.0.114:8281,192.168.18.131:8281] |
|
两个集群分机。 |
2 |
=file("salespart.ctx", 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将两个同分布的游标连接。 |
描述:
游标与可分段集文件外键式连接。
语法:
cs.joinx(C:…,f:K:…,x:F,…;…;…;n)
备注:
用游标cs中的字段C,…匹配可分段集文件f的字段K找到相应记录,然后拼接上该记录的表达式x作为字段F添加到cs中形成新游标。匹配不上外键的记录,字段值缺省填写为null。 f对K有序。
该函数返回的游标不可回转。
选项:
@i |
匹配不上外键则删除整条记录,缺省填成null。 没有x:F参数时,只做针对cs的过滤。 |
@d |
没有x:F参数时,做与@i相反的过滤动作。 |
@q |
cs数据量不大或是序列时,有序匹配加快速度 ; cs是序列时也返回序列。 |
@u |
不保持cs的原次序,可加快速度。 |
@m |
cs对C有序,f对K有序,可用归并方式计算; 此时允许f是游标,cs是多路游标时,f则是同步的多路游标。 |
cs |
游标/多路游标。 |
C |
游标cs的外键。 |
f |
可分段集文件。 |
K |
f的字段,K为#时理解为序号。 |
x |
f的字段表达式。 |
F |
表达式x的字段名。 |
n |
缓存区行数。 |
游标/序列
示例:
游标与集文件常规连接:
|
A |
|
1 |
=file("PersonnelInfo.txt").cursor@t(ID,Name,City,State) |
返回游标,数据内容如下:
|
2 |
=file("StateFile.btx") |
返回对ABBR有序的分段集文件,文件中数据如下:
|
3 |
=A1.joinx(State,A2:ABBR,NAME:SName,CAPITAL:SCapital;10000) |
用A1游标中的字段State匹配StateFile.btx的ABBR字段,将StateFile.btx的NAME、CAPITAL列分别作为SName、SCapital字段拼接到A1游标上形成新的游标。 |
4 |
=A3.fetch@x(100) |
读取A3游标中的前100条记录,读完后关闭游标,返回内容如下:
|
使用@i选项,删除外键不匹配的记录:
|
A |
|
1 |
=file("PersonnelInfo.txt").cursor@t(ID,Name,City,State) |
返回游标,数据内容如下:
|
2 |
=file("StateFile.btx") |
返回对ABBR有序的分段集文件,文件中数据如下:
|
3 |
=A1.joinx@i(State,A2:ABBR,NAME:SName,CAPITAL:SCapital;10000) |
使用@i选项,A1游标中外键State匹配不上的记录删除。 |
4 |
=A3.fetch@x(100) |
读取A3游标中的前100条记录,读完后关闭游标,返回内容如下:
|
使用@d选项:
|
A |
|
1 |
=file("PersonnelInfo.txt").cursor@t(ID,Name,City,State) |
返回游标,数据内容如下:
|
2 |
=file("StateFile.btx") |
返回对ABBR有序的分段集文件,文件中数据如下:
|
3 |
=A1.joinx@d(State,A2:ABBR;10000) |
使用@d选项,保留A1游标中外键State匹配不上的记录。 |
4 |
=A3.fetch@x(100) |
读取A3游标中的前100条记录,读完后关闭游标,返回内容如下:
|
cs为序表时,使用@q选项:
|
A |
|
1 |
=file("PersonnelInfo.txt").import@t(ID,Name,City,State) |
返回序表内容如下:
|
2 |
=file("StateFile.btx") |
返回对ABBR有序的分段集文件,文件中数据如下:
|
3 |
=A1.joinx@iq(State,A2:ABBR,NAME:SName,CAPITAL:SCapital) |
cs为序表时返回序表,使用@q选项,提升计算速度,返回结果如下:
|
f是游标,使用@m选项,归并方式计算:
|
A |
|
1 |
=file("PersonnelInfo.txt").cursor@t(ID,Name,City,State).sortx(State) |
返回对State有序的游标,数据内容如下:
|
2 |
=file("StateFile.btx").cursor@b() |
返回对State有序的游标,数据如下:
|
3 |
=A1.joinx@m(State,A2:ABBR,NAME:SName,CAPITAL:SCapital;10000) |
A1对State有序,A2对ABBR有序,使用@m选项,用归并方式计算。 |
4 |
=A3.fetch@x(100) |
读取A3游标中的前100条记录,读完后关闭游标,返回内容如下:
|
游标与实表外键式连接。
语法:
cs.joinx(C:…,T:K:…,x:F,…;…;…;n)
备注:
用游标cs中的字段C,…匹配实表T的键K并找到相应记录,然后拼接上该记录的表达式x作为字段F添加到cs中形成新游标,匹配不上外键的记录,字段值缺省填写为null。T对K有序。
选项:
@i |
匹配不上外键则删除整条记录,缺省填成null。 没有x:F参数时,只做针对cs的过滤。 |
@d |
没有x:F参数时,做与@i相反的过滤动作。 |
@q |
cs数据量不大或是序列时,使用该选项提升计算速度 。 |
@u |
不保持cs的原次序,可加快速度。 |
@m |
cs对C有序,T对K有序,可用归并方式计算。 |
参数:
cs |
游标/多路游标。 |
C |
游标cs的外键。 |
T |
实表。 |
K |
T的键,K为#时理解为序号。 |
x |
f的字段表达式。 |
F |
表达式x的字段名。 |
n |
缓存区行数。 |
返回值:
游标/序表
示例:
游标与实表常规连接:
|
A |
|
1 |
=connect("demo").cursor("select CID,NAME,POPULATION,STATEID from CITIES") |
返回游标,数据内容如下:
|
2 |
=file("StateFile.ctx").open() |
返回STATEID为键的实表,数据如下:
|
3 |
=A1.joinx(STATEID,A2:STATEID,NAME:SName,POPULATION:Spopulation;1000) |
用A1游标中的字段STATEID匹配实表的STATEID字段,将实表的NAME、POPULATION列分别作为SName、SPopulation字段拼接到A1游标上形成新的游标。 |
4 |
=A3.fetch@x(100) |
读取A3游标中的前100条记录,读完后关闭游标,返回内容如下:
|
使用@i选项,删除外键不匹配的记录:
|
A |
|
1 |
=connect("demo").cursor("select CID,NAME,POPULATION,STATEID from CITIES") |
返回游标,数据内容如下:
|
2 |
=file("StateFile.ctx").open() |
返回STATEID为键的实表,数据如下:
|
3 |
=A1.joinx@i(STATEID,A2:STATEID,NAME:SName,POPULATION:SPopulation;1000) |
使用@i选项,A1游标中外键STATEID匹配不上的记录删除。 |
4 |
=A3.fetch@x(100) |
读取A3游标中的前100条记录,读完后关闭游标,返回内容如下:
|
使用@d选项:
|
A |
|
1 |
=connect("demo").cursor("select CID,NAME,POPULATION,STATEID from CITIES") |
返回游标,数据内容如下:
|
2 |
=file("StateFile.ctx").open() |
返回STATEID为键的实表,数据如下:
|
3 |
=A1.joinx@d(STATEID,A2:STATEID) |
使用@d选项,保留A1游标中外键STATEID匹配不上的记录。 |
4 |
=A3.fetch@x(100) |
读取A3游标中的前100条记录,读完后关闭游标,返回内容如下:
|
cs为序表时,使用@q选项:
|
A |
|
1 |
=connect("demo").query("select CID,NAME,POPULATION,STATEID from CITIES") |
返回序表内容如下:
|
2 |
=file("StateFile.ctx").open() |
返回STATEID为键的实表,数据如下:
|
3 |
=A1.joinx@qi(STATEID,A2:STATEID,NAME:SName,POPULATION:SPopulation;1000) |
cs为序表时返回序表,使用@q选项,提升计算速度,返回结果如下:
|
使用@m选项,归并方式计算:
|
A |
|
1 |
=connect("demo").cursor("select CID,NAME,POPULATION,STATEID from CITIES").sortx(STATEID) |
返回对STATEID有序的游标,数据内容如下:
|
2 |
=file("StateFile.ctx").open() |
返回STATEID为键的实表,数据如下:
|
3 |
=A1.joinx@m(STATEID,A2:STATEID,NAME:SName,POPULATION:SPopulation;1000) |
A1对STATEID有序,A2对STATEID有序,使用@m选项,用归并方式计算。 |
4 |
=A3.fetch@x(100) |
读取A3游标中的前100条记录,读完后关闭游标,返回内容如下:
|
管道与集文件/实表外键式连接。
语法:
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有序。
该函数为结果集函数。
选项:
@i |
匹配不上外键则删除整条记录,缺省填成null。 没有x:F参数时,只做针对cs的过滤。 |
@d |
没有x:F参数时,做与@i相反的过滤动作。 |
@q |
ch数据量不大或是序列时,有序匹配加快速度 。 |
@u |
不保持ch的原次序。 |
@m |
ch对C有序,f/T对K有序,可用归并方式计算。 |
参数:
ch |
管道。 |
C |
管道ch的外键。 |
f |
集文件。 |
T |
实表。 |
K |
f/T的键。 |
x |
f的字段表达式。 |
F |
表达式x的字段名。 |
n |
缓存区行数。 |
返回值:
管道
示例:
管道与集文件常规连接:
|
A |
|
1 |
=connect("demo").cursor("select CID,NAME,POPULATION,STATEID from CITIES") |
返回游标,数据内容如下:
|
2 |
=channel(A1) |
创建管道,并将A1游标中的数据推送到管道。 |
3 |
=file("States.btx") |
返回分段集文件,文件中数据如下:
|
4 |
=A2.joinx(STATEID,A3:STATEID,NAME:SName,POPULATION:SPopulation;1000) |
用A2管道中的字段STATEID匹配集文件的STATEID字段,将集文件的NAME、POPULATION列分别作为SName、SPopulation字段添加到A2上,返回管道。 |
5 |
=A1.fetch() |
A1游标执行取数动作,游标中的数据数据流过管道A2。 |
6 |
=A2.result().fetch() |
获取管道中的数据:
|
管道与实表连接,使用@i选项,删除外键不匹配的记录:
|
A |
|
1 |
=connect("demo").cursor("select CID,NAME,POPULATION,STATEID from CITIES") |
返回游标,数据内容如下:
|
2 |
=channel(A1) |
创建管道,并将A1游标中的数据推送到管道。 |
3 |
=file("StateFile.ctx").open() |
返回STATEID为键的实表,数据如下:
|
4 |
=A2.joinx@i(STATEID,A3:STATEID,NAME:SName,POPULATION:SPopulation;1000) |
用A2管道中的字段STATEID匹配实表的STATEID字段,将实表的NAME、POPULATION列分别作为SName、SPopulation字段添加到A2上,返回管道。 使用@i选项,A2管道中外键STATEID匹配不上的记录删除。 |
5 |
=A1.fetch() |
A1游标执行取数动作,游标中的数据数据流过管道A2。 |
6 |
=A2.result().fetch() |
获取管道中的数据:
|
管道与集文件连接,使用@d选项,做与@i相反的过滤动作:
|
A |
|
1 |
=connect("demo").cursor("select CID,NAME,POPULATION,STATEID from CITIES") |
返回游标,数据内容如下:
|
2 |
=channel(A1) |
创建管道,并将A1游标中的数据推送到管道。 |
3 |
=file("States.btx") |
返回分段集文件,文件中数据如下:
|
4 |
=A2.joinx@d(STATEID,A3:STATEID) |
用A2管道中的字段STATEID匹配集文件的STATEID字段,使用@d选项,过滤掉A2中能匹配上的记录。 |
5 |
=A1.fetch() |
A1游标执行取数动作,游标中的数据数据流过管道A2。 |
6 |
=A2.result().fetch() |
获取管道中的数据:
|
使用@m选项,归并方式计算:
|
A |
|
1 |
=connect("demo").cursor("select CID,NAME,POPULATION,STATEID from CITIES").sortx(STATEID) |
返回游标,数据内容如下:
数据对STATEID有序。 |
2 |
=channel(A1) |
创建管道,并将A1游标中的数据推送到管道。 |
3 |
=file("States.btx") |
返回分段集文件,文件中数据如下:
|
4 |
=A2.joinx@m(STATEID,A3:STATEID,NAME:SName,POPULATION:SPopulation;1000) |
A2对STATEID有序,A3对STATEID有序,使用@m选项,用归并方式计算。 |
5 |
=A1.fetch() |
A1游标执行取数动作,游标中的数据数据流过管道A2。 |
6 |
=A2.result().fetch() |
获取管道中的数据:
|