T.cursor(x:C,…;wi...;k:n)

阅读(1579) 标签: 实表, 分散, 指定段,

描述:

将实表/内表/复组表分段后返回指定段的游标。

语法:

T.cursor(x:C,…;wi,...;k:n)

备注:

把实表/内表/复组表的数据经过x计算和过滤表达式wi过滤后,分成n段,返回第k段的游标,C为结果字段名。从附表中查询的数据也可以包括主表中的字段。

T为复组表时,所有分表同步分段,结果按维度归并。

选项:

@m

T.cursor@m(x:C…;w;n) 生成路数为n的多路游标。参数n省略时用系统缺省值n为整数, n<2时返回普通游标,n省略则用工具 - 选项中的多路游标缺省路数

@v

生成纯序表列式游标,相较普通游标性能有所提升。

@x

游标取完则自动关闭T

@g

T为复组表时,如果后续对游标执行group计算,使用@g选项可提升计算速度。

@w

用于带有更新标识的复组表。

按更新机制归并,分表间存在相同键值时,忽略分表号较小的分表中的记录。分段要以第1分表为准。

处理更新标记,有删除标识的记录不返回到游标中,删除标识记录的键值在复组表中是唯一时,该条记录也会被保留。

使用该选项时,强制读出键字段,如果表中有删除标识列,则也会被强制读出。

@z

逆序取,此时不支持分段。

@p

T为复组表,按照第一个字段归并。

参数:

T

实表/内表/复组表。

x

表达式,缺省将T中所有字段返回到游标中。

C

列别名,可省略。

wi

过滤条件,缺省读取全集,多个条件之间用逗号隔开,为AND关系。除常规的过滤表达式外,过滤条件中还支持如下几种写法,其中K表示实表T中的字段:

1K=w

w通常使用表达式Ti.find(K)Ti.pfind(K)Ti为序表,wnullfalse时将被过滤掉;当w为表达式Ti.find(K)且被选出字段C,...中包含K时,K将被赋值为Ti的指引字段; w为表达式Ti.pfind(K)且被选出字段C,...中包含K时,K将被赋值为KTi 中的序号。

2(K1=w1,Ki=wi,w)

Ki=wi为赋值表达式,参数wi通常可以使用表达式Ti.find(Ki)Ti.pfind(K)Ti为序表;当wi为表达式Ti.find(Ki)且被选出字段C,...中包含Ki时,Ki将被赋值为Ti的指引字段; wi为表达式Ti.pfind(Ki)且被选出字段C,...中包含Ki时,Ki将被赋值为KiTi 中的序号。

w为过滤表达式,w中可引用Ki

3K:Ti

Ti为序表,用实表中Ki的值与Ti的键值作对比,匹配不上的将被过滤掉;当选出字段C,...中包含K时,K将被赋值为Ti的指引字段。

4K:Ti:null

符合K:Ti的记录将被过滤掉。

5K:Ti:#

用序号定位,根据实表中K的值去对比序表Ti的记录序号,对应不上的记录将被过滤掉;当选出字段C,...中包含K时,K将被赋值为Ti的指引字段。

k

正整数,第k段,k小于等于n

n

正整数,分段数。k:n省略返回所有记录。

返回值:

单路游标/多路游标

示例:

 

A

 

1

for 100

 

2

=to(10000).new(#:k1,rand():c1).sort@o(k1)

返回序表:

3

=to(10000).new(#:k1,rand(10000):c2,rand()*1000:c3).sort@o(k1)

返回序表:

4

=A2.cursor()

返回游标。

5

=A3.cursor()

返回游标。

6

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

生成组表文件。

7

=A6.create(#k1,c1)

为组表A6创建k1为键的基表。

8

=A7.append(A4)

A4游标中的数据追加到基表中。

9

=A7.attach(table4,c2,c3)

在基表上创建,名为table4的附表。

10

=A9.append(A5)

A5游标中的数据追加到附表table4中。

11

=A9.cursor(;c2<1000;2:3)

将附表中c2<1000的记录分为3段,返回第2段的所有列组成的游标。

12

=A11.fetch()

获取游标中的数据:

13

=A7.cursor(;c1>0.99)

从基表中取出c1>0.99的记录。

14

=A13.fetch()

获取游标中的数据:

15

=A9.cursor(k1,c1:b,c3;c3>999)

从附表table4中取出基表的字段k1c1和附表的字段c3同时筛选c3大于999的数据,并且将c1的字段名改为b

16

=A15.fetch()

获取游标中的数据:

17

=A9.cursor@m(;;3)

@m选项将附表table4生成多路游标。

 

 

A

 

1

=file("employee1.ctx")

生成组表文件employee1.ctx

2

=A1.create@y(#EID,NAME,GENDER,SALARY)

创建组表employee1.ctx的基表,EIDNAMEGENDERSALARY为基表的列名,其中EID表示维。

3

=connect("demo").cursor("select  EID,NAME,GENDER,SALARY  from  employee")

返回游标。

4

=A2.append@i(A3)

A3游标中的记录追加到基表A2中。

5

=A2.cursor@vx(;SALARY>1000;)

返回列式游标,游标取完自动关闭A2组表。

6

=A5.groups(GENDER;avg(SALARY):SALARY_AVG)

对游标中的数据进行分组聚合运算:

7

=A2.cursor(;SALARY>2000)

报错,提示“Stream Closed

T为复组表:

 

A

 

1

=100000.new(~:ID,rand(2):FM).cursor()

 

2

=file("nc.ctx":[1,2])

生成文件组。

3

=A2.create@y(#ID,FM;if(FM==1,1,2))

返回复组表。

4

=A3.append@x(A1)

A1游标中的数据追加到复组表中,此时复组表内容如下:

1.nc.ctx  2.nc.ctx

 

5

=A3.cursor(;;1:3)

将复组表分成3段返回第1段,默认按照维归并,返回游标内容如下:

可以看到分表1和分表2的数据已经按维归并。

多种过滤方式:

 

A

 

1

=file("emp.ctx")

 

2

=A1.open()

打开组表文件。

3

=A2.import()

省略参数,返回实表中的所有数据

4

=5.new(~:ID,~*~:Num).keys(ID)

生成ID为键的序表:

5

=A2.cursor(EID,NAME;EID=A4.find(EID))

使用K=w过滤方式,wTi.find(K),实表中使EID=A4.find(EID)计算结果为nullfalse的记录过滤掉;EID为选出字段,赋值为序表A4的指引字段:

6

=A2.cursor(EID,NAME;EID=A4.pfind(EID))

使用K=w过滤方式,wTi.pfind(K),实表中使EID=A4.pfind(EID)计算结果为nullfalse的记录过滤掉;EID为选出字段,赋值为EID在序表A4中的序号:

7

=A2.cursor(EID,NAME;EID:A4)

使用K:Ti过滤方式,用实表中EID的值与序表的键值作对比,匹配不上的将被过滤掉:

8

=A2.cursor(NAME,SALARY;EID:A4)

K不被选出的情况,EID不是选出字段,仅过滤:

9

=A2.cursor(EID,NAME;EID:A4:null)

使用K:Ti:null过滤方式,用实表中EID的值与序表的键值作对比,可以匹配上的将被过滤掉:

10

=A2.cursor(EID,NAME;EID:A4:#)

使用K:Ti:#过滤方式,根据实表中EID的值去对比序表的记录序号,对应不上的记录将被过滤掉:

11

=connect("demo").query("select top 2  NAME,GENDER  from employee").keys(NAME)

返回序表,键为NAME

12

=A2.cursor(EID,NAME;(EID=A4.find(EID),NAME=A11.find(NAME),EID!=null&&NAME!=null))

使用(K1=w1,Ki=wi,w)过滤方式,返回符合所有条件的记录:

使用@z选项,逆序取:

 

A

 

1

=100000.new(~:ID,rand(2):FM)

 

2

=file("curz.ctx")

 

3

=A2.create@y(#ID,FM)

创建组表。

4

=A3.append@i(A1)

 

5

=A4.cursor().fetch()

将组表返回成游标,并读取游标中的数据:

6

=A4.cursor@z().fetch()

使用@z选项逆序取,读取游标中的数据如下:

使用@w选项,识别更新标识:

 

A

 

1

=connect("demo").cursor("select  EID,NAME,GENDER  from employee")

 

2

=A1.derive(:Defiled)

 

3

=A2.new(EID,Defiled,NAME,GENDER)

返回游标,内容如下:

4

=file("ecd.ctx":[1,2])

文件组1.ecd.ctx2.ecd.ctx

5

=A4.create@yd(#EID,Defiled,NAME,GENDER;if(GENDER=="F",1,2))

创建复组表,EID为键,使用@d选项,将Defiled作为更新标识字段,GENDER值为F的记录分到1.ed.ctx中,其余分到2.ed.ctx中。

6

=A5.append@ix(A3)

A3游标中的数据追加到复组表中。

7

=create(EID,Defiled,NAME,GENDER).record([0,true,,,1,true,,,

2,false,"BBB","F"])

返回序表内容如下:

8

=file("ecd.ctx":[3])

 

9

=A8.create@yd(#EID,Defiled,NAME,GENDER;3)

增加分表3.ecd.ctxDefiled为更新标识字段。

10

=A9.append@i(A7)

A7序表中的记录追加到分表3.ecd.ctx中。

11

=file("ecd.ctx":[1,2,3]).open()

打开ecd.ctx复组表文件。

12

=A11.cursor().fetch()

将复组表ecd.ctx中的所有数据返回到游标中,数据内容如下:

 

13

=A11.cursor@w().fetch()

使用@w选项,将复组表ecd.ctx返回成游标,识别更新标识,即:EID1的记录更新标识为true(删除)不返回到游标中;

EID2的记录更新标识为false(修改),更新该记录;

EID0的记录更新标识为true(删除),规定带删除标识且键值唯一的记录会被保留下来,所以该记录会返回到游标中,返回游标数据内容如下: