DQL 简述

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

为了便于在虚表中查询数据,特别是处理多表关联时的相关查询,集算器提供了DQL工具,可以使用维查询语言(Dimensional Query Language)DQL来查询数据。在这里只初步介绍DQL工具的使用,关于更详细的说明,请参考集算器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定义中记录对应的字段,如下面添加了枚举伪字段Dept以及二值维度伪字段IfMarriedIfLady

DQL中设置序表的用户定义字段,字段名比较详细,如Enum dim value sequence对应用表达式定义时的enum字段,Binary dimension pseudo field对应用表达式定义时的bits字段等。

DQL 表的定义与使用 DQL 查询

DQL中定义虚表后,就可以在DQL页面中定义DQL所使用的表:

在菜单栏中选择Tool->Generate table from pseudo table,可以用已定义的虚表来直接生成DQL表:

添加后结果如下:

DQL中,表的数据来源于某个虚表,也可以在DQL中添加表后,选择Table source后逐行设置。添加DQL表后,将DQL的元数据存储为test.glmd。表中可唯一决定记录的字段是主键,主键可由虚表使用的组表文件中继承设置。在emps这个表中,并未设定作为外键的字段,这样的字段称为测度字段。

定义完DQL表,就可以在DQL工具中用DQL查询了。在菜单栏中选择Tool->DQL Query,就可以在DQL查询窗口中,用DQL语句执行查询了。DQL的语法与简单的SQL类似,如:

点击Execute键,执行后,可在下方的Browse data页面看到查询结果:

DQL中也可以使用类似SQL的各种语法,如where, as, order by等等,如:

关于DQL中可使用的语法,请参考集算器DQL教程

下面,再添加一个复组表构成的虚表定义如下:

复组表文件的分区号在Zone中设置,分列字段在Zone column中选择,user在不设定时会默认使用首字段。虚表添加完成后,再在DQL表中增加相应的表定义如下:

使用DQL查询时,和在集算器中使用代码在虚表中查询的结果是相同的:

查询所有字段时,与SQL类似可以用*表示,复组表中查询出的数据,同样会按照首字段归并。

类似于var_orders,再把复组表orders2.ctx设入虚表定义中:

复组表orders2.ctx中,首字段是City,需要设置user字段为SID,虚表设置完成后,同样将其设为DQL表:

DQL Query中用DQL查询结果如下:

与在集算器中查询时结果是相同的,数据会在按首字段归并的基础上,按设定的user字段排序。

DQL 中的维度

虚表在使用中,有些字段有可能作为外键使用,而外键字段会与某个表的主键相关联,这个与外键字段相关联的表,称为维表,维表中,主键字段必须是唯一的,与之关联的外键字段称为维度字段。在DQL设置中如果某个维表与其它表的维度字段关联,那么这个维表必须读入内存,如下面的销售员信息表:

这里的销售员虚表数据仍然来自于emps.ctx,但是需要选中Load into memory才能将其读入内存,作为维表使用。另外,由于只使用EID, DeptIDName字段,删除了其它不使用的字段,并添加了过滤条件DeptID==1,只保留销售人员的数据。定义维表后,同样将其设入DQL表:

DQL Query中,查询sellers中的数据如下:

可以看到,这个维表中只有销售员的信息,而且只保留了所需的字段。

在虚表中将维表设为内存表后,即可设置其它虚表的外键与其关联,如修改var_orders的设置,在用户定义字段中添加外键字段如下:

在虚表中添加了外键字段,这个外键字段通过SID与维表var_sellers关联。

此时,var_orders的虚表定义有了变化,在DQL表定义中,将原有的表orders的定义删掉,重新用修改过的虚表定义来直接生成DQL表,可以看到orders中多出了外键设置:

外键的设定和虚表中的外键字段设置是统一的,外键字段SID与维表sellers关联,而维表的主键是EIDDQL表中设置了外键后,可直接在DQL Query中查询外键的字段,如:

DQL表中设置了外键后,就可以在DQL Query中查询外键fk对应维表的字段F了,查询的语法是fk.F,如:

在上面的DQL中,通过SID.Name调用销售员的名字。在更多的时候,表的外键会更多地用于筛选数据,如:

DQL设置界面中,查看Dim and level页,可以看到目前所有DQL表的所有维表和维度层次:

维表简称,只要主键字段唯一,且不是外键的表,均可作为维表。除了与orders的外键做关联的sellers,其它各个DQL表如emps, orders2orders这些表均满足条件,能够作为维表使用,都在维表中列出。

在前面维表使用的例子中,销售员信息表是物理上真实存在的表,除此之外,还可以使用物理上不存在,只是逻辑上使用的表作为维表,这样的维表称为假表,在日期处理中经常使用。

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

DQL Server 简介

DQL Server可理解为是一款将组表文件或集文件构成的虚表作为数据源的数据库,使用DQL语句执行查询,并将结果作为通用的JDBC结果集返回。

完成配置文件service.xml的设置,为DQL Server配置元数据文件(*.glmd)以及DQL Server的各种相关设置,就可以启动DQL Server,用JDBC与其连接。

关于DQL Server更详细的说明,请参考集算器DQL教程