本节内容,涉及功能只有企业版集算器才可使用,其它版本的产品用户可以跳过。
为了便于在虚表中查询数据,特别是处理多表关联时的相关查询,集算器提供了DQL工具,可以使用维查询语言(Dimensional Query Language)DQL来查询数据。
DQL工具目前只在集算器企业版中支持,它的启动类是com.scudata.ide.spl.dql.DQL,执行后就可以开始定义元数据及使用DQL查询。
启动DQL工具后,界面如下:
点击New按钮,或者在菜单栏中选择File->New可以生成新的DQL配置文件:
选择Logical metadata,即可开始定义元数据:
定义元数据时,首先需要定义DQL中所需使用到的虚表,这里的虚表必须来源于组表文件或者集文件。点击Add pseudo table按钮或者在菜单栏中选择Edit->Add pseudo table,在元数据中增加虚表定义:
点击Select键选择虚表使用的数据文件后,在DQL中虚表使用的变量名也可以按需要修改:
这里使用原始的组表文件emps.ctx,在选择虚表数据后,虚表的名称会自动调整为与文件名一致,也可以自行修改。虚表中用户定义字段的定义,和上一节中介绍的虚表自定义字段类似,只是需要在字段表格中添加字段,并修改column定义中记录对应的字段。添加字段时,点击Add row按钮或者在菜单栏中选择Edit->Add row,如下面添加了枚举伪字段Dept以及二值维度伪字段IfMarried与IfLady:
其中枚举伪字段对应的枚举值,可以双击Enum dim value sequence的格子设置:
类似的,二值维度伪字段也可以双击Binary dimension pseudo field对应的格子设置:
在DQL中设置虚表的用户定义字段,界面中对各项设置描述得比较详细,如Enum dim value sequence对应用表达式定义时的enum字段,Binary dimension pseudo field对应用表达式定义时的bits字段等。
在DQL中定义虚表后,就可以在DQL页面中定义DQL所使用的表:
在菜单栏中选择Tool->Generate table from pseudo table,可以用已定义的虚表来直接生成DQL表:
直接点击ok键,添加后结果如下:
DQL中,表的数据来源于已经定义的某个虚表,也可以在DQL页面中,点击或在菜单栏中选择Edit->Add table来添加表,在Pseudo table name中选择已定义的某个虚表后逐行设置:
在DQL中,表对应虚表文件,有数据结构,由记录构成,与序表或者数据库表类似。添加DQL表后,将DQL的元数据存储为test.glmd。表中可唯一决定记录的字段是主键,主键由虚表使用的组表文件中继承设置。在emps这个表中,并未设定作为外键的字段,这样的没有维度的字段称为测度字段。
定义完DQL表,就可以在DQL工具中用DQL查询了。在菜单栏中选择Tool->DQL Query,就可以在DQL查询窗口中,用DQL语句执行查询了。DQL的语法与简单的SQL类似,如:
点击Execute键,执行后,可在下方的Browse data页面看到查询结果:
在DQL中也可以使用类似SQL的各种语法,如where, as, order by等等,如:
下面,再添加一个复组表构成的虚表定义,设置复组表文件时,不能选择复组表的单个文件,而需要修改使用总体的复组表名称:
复组表文件的分区号在Zone中设置,分列字段在Zone column中选择:
虚表添加完成后,再在DQL页面中,选择Tool->Generate table from pseudo table,把新的虚表添加为DQL表:
增加后结果如下:
使用DQL查询时,和在集算器中使用代码在虚表中查询复组表的情况是相同的:
查询所有字段时,与SQL类似可以用*表示,复组表中查询出的数据,同样会按照首字段归并。
类似于orders,再把复组表orders2.ctx设入虚表定义中:
复组表orders2.ctx中,首字段是City,需要设置user字段为SID,虚表设置完成后,同样将其设为DQL表:
同样将其读入DQL表定义后,在DQL Query中用DQL查询结果如下:
与在集算器中查询时结果是相同的,数据会按首字段归并。
在DQL中,可以使用物理上不存在,只是逻辑上使用的表作为维表,这样的维表称为假表,在日期处理中经常使用。
下面,在DQL的Table页中,增加几个日期相关的假表。在菜单栏中选择Edit->Add logical table可以添加假表定义:
新加一个日期假表命名为Day,并点击键添加字段定义,字段定义为day:
假表只能定义一个主键字段,它相当于单字段无记录的表,这里的日期假表的数据类型选择了默认,实际上它的数据会与日期时间类型的字段关联,也就是说假表Day的字段类型是日期,这种类型的假表称为日期维。在DQL表定义窗口中,假表与普通的表图标不同。
下面再增加两个假表YearMonth和Quarter,准备用来作为另外两个时间相关的维表:年月维表和季度维表:
YearMonth表用来获得日期的年月部分,Quarter用来获得日期是第几季度。这两个维表的数据类型都是整数,这样的假表称为整数维。
由于上面这3个假表的数据都是基于时间的,因此它们之间实际上是有关联的,由Day可以计算出这一天的年月和季度,而由YearMonth的数据也可以计算出这个月在哪个季度,这样的关系可以用函数表示。在某个维表中,如果通过函数的计算结果,与另一个维度相关联,那么这样的函数称为层函数。如在维表Day中增加层函数,设置它与另两个时间维表的关联关系:
层函数需要在DQL表定义的Dim and level页面中设置,设置不同的层函数名,与某个选定维表的主键关联,层函数中,用?表示当前维表中的主键值。日期通过层函数可以计算出不同层的数据,对应年月维表或者季度维表。层函数的设置并不是双向的,如可以根据日期数据计算出它所在的季度,但是无法根据季度数值知道某个日期。同样的,在YearMonth中可以设置它与Quarter的层函数关联:
下面,在表orders的外键设置中,添加它与日期维Day的关联关系:
在表orders中,添加了一个新的外键fk1,让它与维表Day关联,关联关系是orders的OTime字段与Day的主键day关联。此时,根据维表Day的层函数,orders也与另外两个日期相关的维表YearMonth和Quarter关联了起来,可以在DQL查询时使用。如:
通过层函数的关联,由OTime的日期数据能够与YearMonth表关联,得到在其中的ym字段数据,查询时用OTime#ym表示由OTime所关联的层函数获得相关字段ym的值。
多层维度也可以在过滤数据时使用,如查询第2季度的订单:
通过在DQL中使用维度,可使对表中数据的利用更加充分,也能够满足更广泛的实际需求。同一个维表可以与多个表的外键关联,而维表的层函数也可以很方便地使用。如上面的日期相关维度,只需要将日期时间外键与日期维表关联,就能获得各层维度的数据。