DQL 工具

阅读(435) 标签: dql, 多表关联,

为了便于在虚表中查询数据,特别是处理多表关联时的相关查询,集算器提供了DQL工具,可以使用维查询语言(Dimensional Query Language)DQL来查询数据。

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以及二值维度伪字段IfMarriedIfLady

其中枚举伪字段对应的枚举值,可以双击Enum dim value sequence的格子设置:

类似的,二值维度伪字段也可以双击Binary dimension pseudo field对应的格子设置:

DQL中设置虚表的用户定义字段,界面中对各项设置描述得比较详细,如Enum dim value sequence对应用表达式定义时的enum字段,Binary dimension pseudo field对应用表达式定义时的bits字段等。

DQL 表的定义与使用 DQL 查询

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中,可以使用物理上不存在,只是逻辑上使用的表作为维表,这样的维表称为假表,在日期处理中经常使用。

下面,在DQLTable页中,增加几个日期相关的假表。在菜单栏中选择Edit->Add logical table可以添加假表定义:

新加一个日期假表命名为Day,并点击键添加字段定义,字段定义为day

假表只能定义一个主键字段,它相当于单字段无记录的表,这里的日期假表的数据类型选择了默认,实际上它的数据会与日期时间类型的字段关联,也就是说假表Day的字段类型是日期,这种类型的假表称为日期维。在DQL表定义窗口中,假表与普通的表图标不同。

下面再增加两个假表YearMonthQuarter,准备用来作为另外两个时间相关的维表:年月维表和季度维表:

YearMonth表用来获得日期的年月部分,Quarter用来获得日期是第几季度。这两个维表的数据类型都是整数,这样的假表称为整数维

由于上面这3个假表的数据都是基于时间的,因此它们之间实际上是有关联的,由Day可以计算出这一天的年月和季度,而由YearMonth的数据也可以计算出这个月在哪个季度,这样的关系可以用函数表示。在某个维表中,如果通过函数的计算结果,与另一个维度相关联,那么这样的函数称为层函数。如在维表Day中增加层函数,设置它与另两个时间维表的关联关系:

层函数需要在DQL表定义的Dim and level页面中设置,设置不同的层函数名,与某个选定维表的主键关联,层函数中,用?表示当前维表中的主键值。日期通过层函数可以计算出不同层的数据,对应年月维表或者季度维表。层函数的设置并不是双向的,如可以根据日期数据计算出它所在的季度,但是无法根据季度数值知道某个日期。同样的,在YearMonth中可以设置它与Quarter的层函数关联:

下面,在表orders的外键设置中,添加它与日期维Day的关联关系:

在表orders中,添加了一个新的外键fk1,让它与维表Day关联,关联关系是ordersOTime字段与Day的主键day关联。此时,根据维表Day的层函数,orders也与另外两个日期相关的维表YearMonthQuarter关联了起来,可以在DQL查询时使用。如:

通过层函数的关联,由OTime的日期数据能够与YearMonth表关联,得到在其中的ym字段数据,查询时用OTime#ym表示由OTime所关联的层函数获得相关字段ym的值。

多层维度也可以在过滤数据时使用,如查询第2季度的订单:

通过在DQL中使用维度,可使对表中数据的利用更加充分,也能够满足更广泛的实际需求。同一个维表可以与多个表的外键关联,而维表的层函数也可以很方便地使用。如上面的日期相关维度,只需要将日期时间外键与日期维表关联,就能获得各层维度的数据。