内表

阅读(2977) 标签: 内表, monory, len, keys, row, find, index,

实表中的数据可以读入内存中成为内表,类似序表一样使用,如:

 

A

1

=file("D:/file/dw/employees.ctx")

2

=A1.open()

3

=A2.memory(;right(Name,6)=="Garcia")

4

=A3(4)

A2中,打开组表employees.ctx中的基表。在A3中,使用函数T.memory(C,…;w)从内表T中筛选出满足条件w的数据,生成姓为Garcia的员工数据的内表。内表在集算器中可以类似序表一样直接查看,A3中得到结果如下:

类似普通的序表,内表中的记录可以直接根据序号访问,如A4中得到内表中的第4条记录如下:

 

除了用实表表生成内表,还可以用cs.memory()函数,用游标生成内表,如:

 

A

1

=file("D:/file/dw/employees.ctx")

2

=A1.open()

3

=A2.cursor(EID,Dept,Name; right(Name,6)=="Garcia")

4

=A3.memory()

5

=A4.len()

A3中,从实表中选出StateID11的员工数据生成游标,在A4中,直接用游标生成内表如下:

由于游标中并未包含实表的所有字段,内表中也只会包含游标中的字段。在A5中,用T.len() 函数,可以得到内表的记录数:

 

内表可以用T.keys(K…) 函数设定主键,设定主键后,可以使用T.find(k)k.row(T)函数查找记录,如:

 

A

1

=file("D:/file/dw/employees.ctx")

2

=A1.open()

3

=A2.memory(;right(Name,6)=="Garcia")

4

>A3.keys(EID)

5

=A3.find(8888)

6

=8888.row(A3)

由于内表的主键仍然是EIDA4中的表达式也可以不再重新设置,A5A6中根据主键值8888,查找到对应的记录,得到的结果是相同的,如下:

设定内表主键后,也可以用T.index() 函数为其创建索引,以提升检索性能。

 

设定主键后,可以用updatedelete函数更新内表。更新函数的使用与普通序表类似,如:

 

A

B

1

=file("D:/file/dw/employees.ctx")

=A1.open()

2

=B1.memory(;right(Name,6)=="Garcia")

 

3

=[176,213,324].(~.row(A2))

=A2.select(Gender=="F").derive()

4

>A3(1).Gender="UNKNOWN"

>B3.run(Gender="Female")

5

>A2.delete(A3)

>A2.update(B3)

6

=B1.cursor(;right(Name,6)=="Garcia").fetch()

 

为了查看内表更新的情况,使用分步执行上面的网格代码,执行到A2时,A2中获取的内表如下:

A3中选出EID2478226的记录如下:

B3从内表中选出女员工的数据,并用derive函数复制:

A4中,修改A3的第一条记录:

修改后可以发现,内表A2中的数据也同时被修改了:

B4中修改了B3中的记录,此时由于B3中的序表是复制的,所以并不会影响原始内表。执行B4后,B3中数据如下:

执行A5后,B2的内表中,EID1762133243条记录都被删除了:

再执行B5,内表中的女员工数据都被修改,特别的,EID176213的员工记录又被添加到了内表中:

A6中,重新从实表中取出数据,如下:

可以发现,内表生成之后,实际上就与实表本身没有关系了,内表的变化并不会影响到实表。