CN109656950B - 递归查询方法、装置、服务器及存储介质 - Google Patents
递归查询方法、装置、服务器及存储介质 Download PDFInfo
- Publication number
- CN109656950B CN109656950B CN201811517375.XA CN201811517375A CN109656950B CN 109656950 B CN109656950 B CN 109656950B CN 201811517375 A CN201811517375 A CN 201811517375A CN 109656950 B CN109656950 B CN 109656950B
- Authority
- CN
- China
- Prior art keywords
- result set
- recursive
- query
- instruction
- cache
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种递归查询方法、装置、服务器及存储介质,该方法包括:获取递归查询请求,并根据待查询数据对象的标识,确定递归查询指令,对待查询数据对象执行查询指令,得到第一结果集,并将第一结果集存储至第一缓存,对第一结果集执行递归指令,得到第二结果集,并将第二结果集存储至第二缓存,若第二结果集为非空集,则清空第一缓存以及交换第一缓存和第二缓存的指针,重复执行对第一结果集执行递归指令,得到第二结果集,并将第二结果集存储至第二缓存,直至第二结果集为空集。上述技术方案,通过循环执行递归指令,直至得到的第二结果集为空集,避免了由于SELECT语句嵌套层次过多而导致的难以阅读和维护的问题。
Description
技术领域
本发明实施例涉及计算机技术领域,尤其涉及一种递归查询方法、装置、服务器及存储介质。
背景技术
递归是一个对象在其定义或说明中直接或间接调用自身的一种方法,公用表表达式(Common Table Expression,CTE)是一个在查询中定义的临时命名结果集,CTE的一个重要优点是可以引用自身,从而创建递归CTE。递归CTE是一个重复执行初始CTE以返回数据子集直到获取完整结果的公用表表达式,当某个查询引用递归CTE时,该查询被称为递归查询。
递归查询是一种常见的查询方式,递归查询等价于将多个SELECT语句的查询结果通过UNION ALL的方式,合并成一个结果集输出,其中,UNION ALL是一种双目集合操作符,用于合并两个SELECT语句的结果集,即对两个SELECT语句的结果集进行并集操作,包括重复的数据,这种通过UNION ALL关联的各个SELECT语句分别作为一个分支,当前分支的数据来源于上一个分支的查询结果,第一个分支的查询结果作为第一结果,直到当前分支的查询结果为空集为止,这种查询方式每个分支存在相同的语句,每个分支都去执行一遍代价太大,当前分支的层次越深,当前分支的SELECT语句嵌套层次越多,会使SQL(StructuredQuery Language,结构化查询语言)语句难以阅读和维护。
发明内容
本发明实施例提供一种递归查询方法、装置、服务器及存储介质,以简化查询语句的执行,便于阅读和维护。
第一方面,本发明实施例提供一种递归查询方法,包括:
获取递归查询请求,所述递归查询请求包括待查询数据对象的标识,并根据所述待查询数据对象的标识,确定递归查询指令,所述递归查询指令包括查询指令和递归指令;
对所述待查询数据对象执行所述查询指令,得到第一结果集,并将所述第一结果集存储至第一缓存;
对所述第一结果集执行所述递归指令,得到第二结果集,并将所述第二结果集存储至第二缓存;
若所述第二结果集为非空集,则清空所述第一缓存以及交换所述第一缓存和第二缓存的指针,重复执行对所述第一结果集执行所述递归指令,得到第二结果集,并将所述第二结果集存储至第二缓存,直至所述第二结果集为空集。
第二方面,本发明实施例还提供一种递归查询装置,该装置包括:
确定模块,用于获取递归查询请求,所述递归查询请求包括待查询数据对象的标识,并根据所述待查询数据对象的标识,确定递归查询指令,所述递归查询指令包括查询指令和递归指令;
第一执行模块,用于对所述待查询数据对象执行所述查询指令,得到第一结果集,并将所述第一结果集存储至第一缓存;
第二执行模块,用于对所述第一结果集执行所述递归指令,得到第二结果集,并将所述第二结果集存储至第二缓存;
第三执行模块,用于若所述第二结果集为非空集,则清空所述第一缓存以及交换所述第一缓存和第二缓存的指针,重复执行对所述第一结果集执行所述递归指令,得到第二结果集,并将所述第二结果集存储至第二缓存,直至所述第二结果集为空集。
第三方面,本发明实施例还提供一种服务器,包括:
一个或多个处理器;
存储器,用于存储一个或多个程序;
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如第一方面所述的递归查询方法。
第四方面,本发明实施例还提供一种存储介质,其上存储有计算机程序,该程序被处理器执行时实现如第一方面所述的递归查询方法。
本发明实施例提供一种递归查询方法、装置、服务器及存储介质,通过获取递归查询请求,所述递归查询请求包括待查询数据对象的标识,并根据所述待查询数据对象的标识,确定递归查询指令,所述递归查询指令包括查询指令和递归指令,对所述待查询数据对象执行所述查询指令,得到第一结果集,并将所述第一结果集存储至第一缓存,对所述第一结果集执行所述递归指令,得到第二结果集,并将所述第二结果集存储至第二缓存,若所述第二结果集为非空集,则清空所述第一缓存以及交换所述第一缓存和第二缓存的指针,重复执行对所述第一结果集执行所述递归指令,得到第二结果集,并将所述第二结果集存储至第二缓存,直至所述第二结果集为空集,通过交换第一缓存和第二缓存的指针,重复执行递归指令,直至第二结果集为空集,避免了由于SELECT语句嵌套层次过多而导致的难以阅读和维护的问题,提高了查询语句执行的效率。
附图说明
图1为本发明实施例一提供的一种递归查询方法的流程图;
图2为本发明实施例二提供的一种递归查询方法的流程图;
图3为递归查询执行过程的示意图;
图4为本发明实施例三提供的一种递归查询装置的结构图;
图5为本发明实施例四提供的一种服务器的结构图。
具体实施方式
下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。
实施例一
图1为本发明实施例一提供的一种递归查询方法的流程图,本实施例可适用于根据查询请求,获取查询结果的情况,该方法可以由递归查询装置来执行,该装置集成在服务器中,具体的,该方法包括如下步骤:
S110、获取递归查询请求,并根据所述待查询数据对象的标识,确定递归查询指令。
其中,所述递归查询请求包括待查询数据对象的标识,所述递归查询指令包括查询指令和递归指令。具体的,待查询数据对象的标识是在查询中临时定义的名称,也可以与表或视图同名,例如可以用“PC”来表示待查询数据对象,如果待查询数据对象的名称与已有对象(表或视图)的名称同名时,待查询数据对象优先级最高,即优先使用待查询数据对象。可选的,递归查询请求还可以包括查询要求或查询结果的形式等,其中,查询要求可以是获取查询结果采用的具体方式,也可以是获取查询结果的速率要求等,具体的查询要求可以根据实际情况设定。查询结果的形式可以是将每次查询的结果全部列出,也可以只显示最终的查询结果,例如,查询一个表中所有课程的选修课,可以只显示最终的查询结果,也可以将各次的查询结果全部列出。
可以理解的是,待获取的查询结果通常需要迭代多次才可以得到最终的查询结果,即第一次迭代得到一个结果,然后在该结果的基础上继续迭代,得到最终的查询结果。实施例中将获取第一次查询结果的指令称为查询指令,基于第一次查询结果继续迭代的指令称为递归指令。
具体的,根据递归查询请求中待查询数据对象的标识、查询要求或查询结果的形式,可以确定满足递归查询请求的查询指令和递归指令,并根据查询指令和递归指令获取查询结果,其中,查询指令和递归指令可以是直接调用的现有指令,也可以是对现有指令进行修改的指令。
S120、对所述待查询数据对象执行所述查询指令,得到第一结果集,并将所述第一结果集存储至第一缓存。
具体的,第一结果集是满足查询指令的多行记录(也称为元组)的集合,即包括多行记录。第一缓存用于存储第一结果集,不同的数据库存储结果集的数据结构可能不同,此处不做赘述。假定缓存数据的存储结构类型记为“XDTA”,实施例中定义XDTA类型的L_XDTA表示第一缓存。具体的,对待查询数据对象执行查询指令,得到第一结果集T0,并将第一结果集T0存储至第一缓存L_XDTA。需要说明的是,在递归查询的过程中,查询指令仅执行一次。
S130、对所述第一结果集执行所述递归指令,得到第二结果集,并将所述第二结果集存储至第二缓存。
第二结果集与第一结果集类似,是满足递归指令的多行记录的集合。具体的,对第一结果集执行递归指令,即将第一结果集T0作为输入,执行递归指令,输出结果集T1。第二缓存与第一缓存使用相同的存储数据结构类型,实施例中定义XDTA类型的R_XDTA表示第二缓存,存储第二结果集。
S140、所述第二结果集是否为空集,若是,执行S160,否则,执行S150。
具体的,实施例将第二结果集为空集作为执行结束的条件,如果第二结果集为空集,则执行S160。如果第二结果集为非空集,则执行S150,直至第二结果集为空集。例如执行递归指令得到结果集Ti,若结果集Ti没有满足执行结束的条件,需要继续将结果集Ti作为输入,继续执行递归指令,得到结果集Ti+1,依次类推,直至得到的结果集Tn满足执行结束的条件为止,最终结果集为结果集T0、结果集T1至结果集Tn的并集。
S150、清空所述第一缓存以及交换所述第一缓存和第二缓存的指针,并返回执行S130。
具体的,如果第二结果集为非空集,表明递归查询未结束,则清空第一缓存L_XDTA并交换第一缓存L_XDTA和第二缓存R_XDTA的指针,即始终保持第一缓存L_XDTA中有数据,该数据为执行递归指令的源数据,第二缓存R_XDTA中没有数据,第二缓存R_XDTA用于存储递归指令的目标结果集,执行递归指令时,从第一缓存L_XDTA中取数据,并将执行结果存储至第二缓存R_XDTA。示例性的,第一缓存L_XDTA中存储的是第一结果集T0,第一次执行递归指令后,得到结果集T1并存储至第二缓存R_XDTA,如果结果集T1为非空集,则清空第一缓存L_XDTA,并交换第一缓存L_XDTA和第二缓存R_XDTA的指针,其中,交换第一缓存L_XDTA和第二缓存R_XDTA的指针,相当于将结果集T1存储至第一缓存L_XDTA,第二缓存R_XDTA中没有数据,然后将结果集T1从第一缓存L_XDTA取出,作为输入,执行递归指令,并将得到的结果集T2存储至第二缓存R_XDTA,如果结果集T2为非空集,继续执行清空第一缓存L_XDTA以及交换第一缓存L_XDTA和第二缓存R_XDTA的指针,并返回执行S130,直至得到的结果集Tn为空集。
需要说明的是,第一缓存L_XDTA中存储的第一结果集是变化的,即第一次执行递归指令时,第一缓存L_XDTA中存储的第一结果集为结果集T0,当以结果集T0为输入,执行递归指令得到结果集T1,如果结果集T1为非空集,则交换第一缓存L_XDTA和第二缓存R_XDTA的指针,此时第一缓存L_XDTA中存储的第一结果集即为结果集T1,实施例中的第一结果集T0也可以称为结果集T0。
S160、递归查询结束。
示例性的,假定结果集T3为空集,则最终的查询结果即为结果集T0、结果集T1、结果集T2和结果集T3的并集。
本发明实施例一提供一种递归查询方法,通过获取递归查询请求,所述递归查询请求包括待查询数据对象的标识,并根据所述待查询数据对象的标识,确定递归查询指令,所述递归查询指令包括查询指令和递归指令,对所述待查询数据对象执行所述查询指令,得到第一结果集,并将所述第一结果集存储至第一缓存,对所述第一结果集执行所述递归指令,得到第二结果集,并将所述第二结果集存储至第二缓存,若所述第二结果集为非空集,则清空所述第一缓存以及交换所述第一缓存和第二缓存的指针,重复执行对所述第一结果集执行所述递归指令,得到第二结果集,并将所述第二结果集存储至第二缓存,直至所述第二结果集为空集,通过交换第一缓存和第二缓存的指针,重复执行递归指令,直至第二结果集为空集,避免了由于SELECT语句嵌套层次过多而导致的难以阅读和维护的问题,提高了查询语句执行的效率。
实施例二
图2为本发明实施例提供的一种递归查询方法的流程图,在上述实施例的基础上进行具体化,具体的,该方法包括如下步骤:
S210、获取递归查询请求,并根据所述待查询数据对象的标识,确定递归查询指令。
S220、对所述待查询数据对象执行所述查询指令,得到第一结果集,并将所述第一结果集存储至第一缓存。
为了进一步描述对待查询数据对象执行查询指令,得到第一结果集的过程,下面对“对所述待查询数据对象执行所述查询指令”进行具体化:
所述查询指令包括连接符。具体的,连接符用于将各次迭代的结果集合并为一个结果集输出,连接符的形式可以根据实际需要设置,例如可以选择双目集合操作符UNIONALL作为连接符,其中,双目集合操作符UNION ALL是一种包含两个执行过程的操作符,即先执行第一过程,得到第一结果,然后以第一结果作为输入,执行第二过程,其中,第一过程对应的指令为查询指令,第二过程对应的指令为递归指令。
相应的,所述对所述待查询数据对象执行所述查询指令,包括:
所述连接符带有预设标识时,对所述待查询数据对象执行所述查询指令。
具体的,预设标识用于区别常规的连接符,当连接符中包含预设标识时,表明该连接符为递归查询对应的连接符。例如,可以在连接符中添加预设标识WITH(PC),其中,WITH表示递归查询,PC表示待查询数据对象的名称,添加预设标识WITH(PC)后,表示该连接符为递归查询且待查询数据对象名称为PC对应的连接符。对待查询数据对象PC执行递归查询指令时,先执行连接符对应的第一过程,即查询指令,得到第一结果集T0,其中,第一结果集T0的列数与待查询数据对象PC的列数相同。
S230、所述第一结果集是否为空集,若是,执行S270,否则,执行S240。
具体的,如果第一结果集T0为空集,则不再执行递归指令,递归查询过程结束,第一结果集T0即空集为最终的结果集,如果第一结果集T0为非空集,则需要以第一结果集T0为基础,继续执行递归指令以获取最终的结果集。
S240、对所述第一结果集执行所述递归指令,得到第二结果集,并将所述第二结果集存储至第二缓存。
为了进一步描述对第一结果集T0执行递归指令,得到第二结果集的过程,下面对“对所述第一结果集执行所述递归指令,得到第二结果集”进行具体化:
所述第一结果集还返回至所述连接符,所述递归指令包括操作符,所述操作符与所述连接符对应。
具体的,第一结果集T0除了存储至第一缓存,还向上返回至连接符UNION ALL。示例性的,假定执行查询指令时依据的执行路径为:UNION ALL(4)=>PRJT2(5)=>SLCT2(6)=>CSCN2(7),其中,UNION ALL为连接符,括号内的标识对应执行路径的序号,即执行按照由上而下的顺序执行,数据流则由下而上,即数据流向路径为:CSCN2(7)=>SLCT2(6)=>PRJT2(5)=>UNION ALL(4)(T0),最终将第一结果集T0传递给连接符UNION ALL(4)。可以理解的是,不同的查询指令依据的执行路径是不同的,实施例中只是给出了其中一种执行路径。
操作符可以根据具体的查询方式进行选择,例如,采用基于递归WITH的查询方式时,操作符可以是WITH SCAN,操作符WITH SCAN与连接符UNION ALL对应,实际执行时,查找到操作符WITH SCAN对应的带有预设标识的连接符UNION ALL,即可执行连接符UNION ALL对应的递归指令。
相应的,所述对所述第一结果集执行所述递归指令,得到第二结果集,包括:
查找与所述操作符对应的连接符,取出所述连接符中的第一结果集,对所述第一结果集执行所述递归指令,得到第二结果集,并将所述第二结果集返回至所述连接符。
具体的,根据操作符WITH SCAN,查找与操作符WITH SCAN对应的连接符UNIONALL,并将查找到的连接符UNION ALL进行保存,然后取出连接符UNION ALL中的第一结果集T0,对第一结果集T0执行递归指令,得到结果集T1,并返回至连接符UNION ALL。示例性的,假定执行递归指令时依据的执行路径为:UNION ALL(4)=>PRJT2(8)=>HASH2INNER JOIN(9)=>WITH SCN(11),操作符WITH SCN(11)找到上层对应的连接符UNION ALL(4),取出连接符UNION ALL(4)中的第一结果集T0,数据流向路径为:UNION ALL(4)(T0)=>WITH SCN(11)=>HASH2INNER JOIN(9)=>PRJT2(8)=>UNION ALL(4)(T1),最终将第二结果集T1传递给连接符UNION ALL(4)。
可以理解的是,同一结果集在不同的位置具有不同的表述,例如当以结果集T0作为输入,执行递归指令时,得到结果集T1,当结果集T1存储至第二缓存R_XDTA时,又可以称为第二结果集T1,如果第二结果集T1为非空集,交换第一缓存L_XDTA和第二缓存R_XDTA的指针后,第二结果集T1作为再次执行递归指令的输入时,又可以称为第一结果集T1。
递归指令始终将得到的结果集返回至连接符UNION ALL,并从连接符UNION ALL中取出上一次得到的结果集,继续执行递归指令,直至得到的结果集为空集,其中,递归指令的执行顺序和数据流向顺序与查询指令类似。
进一步的,在对所述待查询数据对象执行所述递归查询指令之前,需要确定待查询数据对象各个列的数据类型,以便根据各个列的数据类型创建相应的缓存存储结果集。具体的,根据待查询数据对象的名称,确定待查询数据对象各个列的信息,其中,列的个数以及各个列的名称在定义待查询数据对象的名称时指定,待查询数据对象各个列的数据类型是通过解析基准查询语句和递归语句得到的,基准查询语句也可以称为基准成员,递归语句也可以称为递归成员。
具体的,为了确定基准查询语句是否合法,需要检查查询项的个数与待查询数据对象的列的个数是否相等,如果不相等,表示基准查询语句不合法,系统出现报错,并返回错误位置,其中,查询项为预先设置的待查询数据对象各个列的数据类型。如果相等,表明基准查询语句合法,此时,根据查询项中各个列的数据类型设置基准查询语句中待查询数据对象各个列的数据类型的初值。需要注意的是,基准查询语句中不能出现待查询数据对象的名称。
示例性的,假定待查询数据对象的名称为PC,定义中指定PC包含cno、cname和cpno三列,通过解析基准查询语句,假设查询项涉及到对象Course的各个列信息为:cno int、cname varchar(10)和cpno int,两者包含的列的个数相等,表明基准查询语句合法,其中,查询项的列名与PC的列名可以不同,然后根据查询项中三个列的数据类型将PC(cno、cname、cpno)三个列的数据类型的初值分别设置为int、varchar(10)和int。
与基准查询语句类似,递归语句中也包含查询项,递归语句查询项列的个数也需用与PC列的个数相同,同时,递归语句查询项的数据类型与基准查询语句查询项的数据类型需要兼容,不要求完全一致。可以理解的是,递归语句可能会多次迭代执行,在迭代过程中,PC的各个列的数据所表示的数值范围或字符串长度等会发生变化,数据类型可能需要调整到最大化,因此,在初步根据基准查询语句的查询项确定PC(cno、cname、cpno)三个列的数据类型后,需要循环解析递归语句中的查询项,直至PC(cno、cname、cpno)三个列的数据类型不再变化为止。
为了便于描述,实施例称cno为第一个查询项,cname为第二个查询项,cpno为第三个查询项。示例性的,解析递归语句中的查询项时,如果解析到第三个查询项对应表达式为PC.cpno+1.1,由于该表达式中涉及数值计算,假设小数1.1对应的数值类型为DEC,则需要将PC的第三个查询项的数据类型由int调整为最大数值类型,如DEC,PC(cno、cname、cpno)三个列的最终数据类型为:int、varchar(10)和DEC,将第三个查询项的数据类型调整为最大数值类型可以避免多次迭代导致数值溢出,如:PC.cpno的初值来源于基准查询语句,假设为1,第一次执行递归语句结果为2.1,第二次执行递归语句结果为3.1,随着递归语句的执行,PC.cpno值会越来越大,数据类型int已不足以表示PC.cpno精度和值,因此,在涉及数值计算时,采取数值类型放大规则,将目标数据类型最大化,例如可以将数据类型INT、数据类型BIGTINT最大化为数值类型DEC,将数据类型FLOAT最大化为数据类型DOUBLE。
一旦当PC各个列的数据类型发生了变化,需要再次解析递归语句的查询项,假定递归语句的第一个查询项对应表达式PC.cpno,PC的第一个查询项受第三个查询项的影响,当第三个查询项的数据类型调整为DEC时,PC的第一个查询项的数据类型也需用由int需要调整为DEC,则PC(cno、cname、cpno)三个列的最终数据类型为:DEC、varchar(10)和DEC。如果第三次解析递归语句的查询项时,PC各个列的数据类型没有发生变化,则停止解析递归语句的查询项。
同理,如果递归语句查询项中涉及待查询数据对象PC的字符串列,如:PC.cname,也需要将目标数据类型放大到最长字符串。例如,假定解析递归语句时,PC的第二个查询项对应的表达式为PC.cname||'/'||Course.cname,常规连接符UNION ALL的目标数据类型varchar(21),即PC.cname初始数据类型为varchar(10)+“\”长度为1+对象Course列name数据类型varchar(10),当涉及多次迭代时,varchar(21)明显不够存储执行递归指令的结果集,因此,PC的第二个查询项的数据类型由varchar(10)调整为最大字符串长度,如varchar(32K),PC(cno、cname、cpno)三个列的最终数据类型为:DEC、varchar(32K)和DEC。示例性的,假设对象Course的cname中存在记录“数据结构”,假定每个汉字占用2个字节,第一次迭代结果为“数据结构/数据结构”,占用17个字节,第二次迭代结果为“数据结构/数据结构/数据结构”,占用26个字节,可见varchar(21)并不足以存储迭代过程中产生的结果。
需要说明的是,实施例中涉及基准查询语句、递归查询语句、查询指令以及递归指令,在确定待查询数据对象各个列的数据类型时,是通过解析基准查询语句和递归查询语句得到的,基准查询语句解析完之后,生成查询指令,递归语句解析完之后生成递归指令,在执行递归查询时,先执行查询指令,再执行递归指令。
S250、所述第二结果集是否为空集,若是,执行S270,否则,执行S260。
S260、清空所述第一缓存以及交换所述第一缓存和第二缓存的指针,并返回执行S240。
S270、递归查询结束。
当然,本实施例还可以以第一结果集为空集作为递归查询结束的条件,即将S250去掉,每次只判断第一结果集是否为空集,如果第一结果集为空集,则递归查询结束。
下面对递归查询方法的执行过程进行简单描述:
图3为递归查询执行过程的示意图,具体的,对待查询数据对象按照由上而下的执行顺序先执行查询指令再执行递归指令。执行查询指令时,得到的第一结果集向上返回至连接符,如果第一结果集为空集,则递归查询结束,最终的结果集为空集。如果第一结果集为非空集,再执行递归指令,递归指令中的操作符查找带有预设标识的连接符,在查找到连接符后,将该连接符保存以便多次递归执行使用,递归指令从连接符中取出第一结果集,作为输入,执行递归指令,并将得到的结果集向上返回至连接符,如果第二结果集为空集,则递归查询结束,如果第二结果集为非空集,则循环执行递归指令,直至得到的第二结果集为空集,最终的结果集为结果集T0、结果集T1至结果集Tn的并集,由此一个递归查询的过程完成。
需要说明的是,递归指令只有第一次执行时从连接符中取出的是执行查询指令返回的结果集,循环执行递归指令时,递归指令从连接符中取出的是上次执行递归指令返回的结果集。
本发明实施例二提供一种递归查询方法,在上述实施例的基础上,对“对所述待查询数据对象执行所述查询指令”和“对所述第一结果集执行所述递归指令,得到第二结果集”进行具体化,如果连接符带有预设标识,则对待查询数据对象执行查询指令,得到第一结果集,如果第一结果集为空集,则递归查询结束,如果第一结果集为非空集,则查找与操作符对应的连接符,取出连接符中的第一结果集,对第一结果集执行递归指令,得到第二结果集,并循环执行递归指令,直至第二结果集为空集,避免了由于SELECT语句嵌套层次过多而导致的难以阅读和维护的问题,同时,由于递归指令中增加了操作符,在执行递归指令时,从与操作符对应的连接符中批量获取数据,提高了递归查询的执行效率。
在上述实施例的基础上,可选的,还可以采用变量的方式驱动递归指令的执行。示例性的,在解析递归语句的查询项时,将递归语句中引用的视图PC的各个列添加到设定链表中,如果递归语句中出现的PC的FROM链表为单表查询,则将PC替换为SYSDUAL,SYSDUAL为系统内建表,默认只有一行记录,如果递归语句中出现的PC的FROM链表为多表连接查询,将PC删除或者替换为SYSDUAL。当递归语句解析完成后,将设定链表中引用的视图PC的列转换为变量,并记录变量与列的映射关系到变量链表中,然后根据基准查询语句和递归语句查询项的数据类型调整视图PC各个列的数据类型,具体的调整过程前面已经描述过,此处不再赘述。
在执行递归查询时,也是先执行查询指令,再执行递归指令。具体的,执行查询指令时,得到的第一结果集缓存至第一缓存,如果第一结果集为空集,则递归查询结束,最终的结果集为空集。假定以cur_pos表示第一缓存当前读取数据的位置,cur_pos的初始值为0,当第一结果集为非空集时,从第一缓存的cur_pos位置读取一条数据,并根据变量链表中记录的变量与列的映射关系填充变量的值,然后执行递归指令,并将得到的结果集缓存至第二缓存,此时,cur_pos的值加1,然后重复执行从第一缓存的cur_pos位置读取一条数据,并根据变量链表中记录的变量与列的映射关系填充变量的值的过程,直至cur_pos的值与第一缓存的行数相等,如果第二缓存中有数据,清空第一缓存且cur_pos清0,同时交换第二缓存和第一缓存的指针,直至第二缓存中的数据为空集,递归查询结束。
实施例三
图4为本发明实施例三提供的一种递归查询装置的结构图,该装置可以执行上述实施例所述的递归查询方法,具体的,该装置包括:
确定模块310,用于获取递归查询请求,所述递归查询请求包括待查询数据对象的标识,并根据所述待查询数据对象的标识,确定递归查询指令,所述递归查询指令包括查询指令和递归指令;
第一执行模块320,用于对所述待查询数据对象执行所述查询指令,得到第一结果集,并将所述第一结果集存储至第一缓存;
第二执行模块330,用于对所述第一结果集执行所述递归指令,得到第二结果集,并将所述第二结果集存储至第二缓存;
第三执行模块340,用于若所述第二结果集为非空集,则清空所述第一缓存以及交换所述第一缓存和第二缓存的指针,重复执行对所述第一结果集执行所述递归指令,得到第二结果集,并将所述第二结果集存储至第二缓存,直至所述第二结果集为空集。
本发明实施例三提供一种递归查询装置,通过获取递归查询请求,所述递归查询请求包括待查询数据对象的标识,并根据所述待查询数据对象的标识,确定递归查询指令,所述递归查询指令包括查询指令和递归指令,对所述待查询数据对象执行所述查询指令,得到第一结果集,并将所述第一结果集存储至第一缓存,对所述第一结果集执行所述递归指令,得到第二结果集,并将所述第二结果集存储至第二缓存,若所述第二结果集为非空集,则清空所述第一缓存以及交换所述第一缓存和第二缓存的指针,重复执行对所述第一结果集执行所述递归指令,得到第二结果集,并将所述第二结果集存储至第二缓存,直至所述第二结果集为空集,通过交换第一缓存和第二缓存的指针,重复执行递归指令,直至第二结果集为空集,避免了由于SELECT语句嵌套层次过多而导致的难以阅读和维护的问题,提高了查询语句执行的效率。
在上述实施例的基础上,所述查询指令包括连接符,相应的,第一执行模块320,包括:
第一执行单元,用于所述连接符带有预设标识时,对所述待查询数据对象执行所述查询指令。
在上述实施例的基础上,所述第一结果集还返回至所述连接符,所述递归指令包括操作符,所述操作符与所述连接符对应,相应的,第二执行模块330,包括:
第二执行单元,用于查找与所述操作符对应的连接符,取出所述连接符中的第一结果集,对所述第一结果集执行所述递归指令,得到第二结果集,并将所述第二结果集返回至所述连接符。
在上述实施例的基础上,该装置还包括:
判断模块,用于在得到第一结果集之后,如果所述第一结果集为空集,递归查询结束。
本发明实施例三提供的递归查询装置可以用于执行上述任意实施例提供的递归查询方法,具备相应的功能和有益效果。
实施例四
图5为本发明实施例四提供的一种服务器的结构图,具体的,参考图5,该服务器包括:处理器410、存储器420、输入装置430和输出装置440,服务器中处理器410的数量可以是一个或多个,图5中以一个处理器410为例,服务器中的处理器410、存储器420、输入装置430和输出装置440可以通过总线或其他方式连接,图5中以通过总线连接为例。
存储器420作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序以及模块,如本发明实施例中的递归查询方法对应的程序指令/模块。处理器410通过运行存储在存储器420中的软件程序、指令以及模块,从而执行服务器的各种功能应用以及数据处理,即实现上述实施例的递归查询方法。
存储器420主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据终端的使用所创建的数据等。此外,存储器420可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储器420可进一步包括相对于处理器410远程设置的存储器,这些远程存储器可以通过网络连接至服务器。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
输入装置430可用于接收输入的数字或字符信息,以及产生与服务器的用户设置以及功能控制有关的键信号输入。输出装置440可包括显示屏等显示设备、扬声器以及蜂鸣器等音频设备。
本发明实施例四提供的服务器与上述实施例提供的递归查询方法属于同一发明构思,未在本实施例中详尽描述的技术细节可参见上述实施例,并且本实施例具备执行递归查询方法相同的有益效果。
实施例五
本发明实施例五还提供一种存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本发明任意实施例所述的递归查询方法。
当然,本发明实施例所提供的一种包含计算机可执行指令的存储介质,其计算机可执行指令不限于如上所述的递归查询方法中的操作,还可以执行本发明任意实施例所提供的递归查询方法中的相关操作,且具备相应的功能和有益效果。
通过以上关于实施方式的描述,所属领域的技术人员可以清楚地了解到,本发明可借助软件及必需的通用硬件来实现,当然也可以通过硬件实现,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如计算机的软盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(RandomAccess Memory,RAM)、闪存(FLASH)、硬盘或光盘等,包括若干指令用以使得一台计算机设备(可以是机器人,个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的递归查询方法。
注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。
Claims (10)
1.一种递归查询方法,其特征在于,包括:
获取递归查询请求,所述递归查询请求包括待查询数据对象的标识,并根据所述待查询数据对象的标识,确定递归查询指令,所述递归查询指令包括查询指令和递归指令;
对所述待查询数据对象执行所述查询指令,得到第一结果集,并将所述第一结果集存储至第一缓存;
对所述第一结果集执行所述递归指令,得到第二结果集,并将所述第二结果集存储至第二缓存;
若所述第二结果集为非空集,则清空所述第一缓存以及交换所述第一缓存和第二缓存的指针,重复执行对所述第一结果集执行所述递归指令,得到第二结果集,并将所述第二结果集存储至第二缓存,直至所述第二结果集为空集。
2.根据权利要求1所述的方法,其特征在于,所述查询指令包括连接符,相应的,所述对所述待查询数据对象执行所述查询指令,包括:
所述连接符带有预设标识时,对所述待查询数据对象执行所述查询指令。
3.根据权利要求2所述的方法,其特征在于,所述第一结果集还返回至所述连接符,所述递归指令包括操作符,所述操作符与所述连接符对应,相应的,所述对所述第一结果集执行所述递归指令,得到第二结果集,包括:
查找与所述操作符对应的连接符,取出所述连接符中的第一结果集,对所述第一结果集执行所述递归指令,得到第二结果集,并将所述第二结果集返回至所述连接符。
4.根据权利要求1所述的方法,其特征在于,在得到第一结果集之后,还包括:如果所述第一结果集为空集,递归查询结束。
5.一种递归查询装置,其特征在于,包括:
确定模块,用于获取递归查询请求,所述递归查询请求包括待查询数据对象的标识,并根据所述待查询数据对象的标识,确定递归查询指令,所述递归查询指令包括查询指令和递归指令;
第一执行模块,用于对所述待查询数据对象执行所述查询指令,得到第一结果集,并将所述第一结果集存储至第一缓存;
第二执行模块,用于对所述第一结果集执行所述递归指令,得到第二结果集,并将所述第二结果集存储至第二缓存;
第三执行模块,用于若所述第二结果集为非空集,则清空所述第一缓存以及交换所述第一缓存和第二缓存的指针,重复执行对所述第一结果集执行所述递归指令,得到第二结果集,并将所述第二结果集存储至第二缓存,直至所述第二结果集为空集。
6.根据权利要求5所述的装置,其特征在于,所述查询指令包括连接符,相应的,第一执行模块,包括:
第一执行单元,用于所述连接符带有预设标识时,对所述待查询数据对象执行所述查询指令。
7.根据权利要求6所述的装置,其特征在于,所述第一结果集还返回至所述连接符,所述递归指令包括操作符,所述操作符与所述连接符对应,相应的,第二执行模块,包括:
第二执行单元,用于查找与所述操作符对应的连接符,取出所述连接符中的第一结果集,对所述第一结果集执行所述递归指令,得到第二结果集,并将所述第二结果集返回至所述连接符。
8.根据权利要求5所述的装置,其特征在于,还包括:
判断模块,用于在得到第一结果集之后,如果所述第一结果集为空集,递归查询结束。
9.一种服务器,其特征在于,包括:
一个或多个处理器;
存储器,用于存储一个或多个程序;
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如权利要求1-4中任一项所述的递归查询方法。
10.一种存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1-4中任一项所述的递归查询方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811517375.XA CN109656950B (zh) | 2018-12-12 | 2018-12-12 | 递归查询方法、装置、服务器及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811517375.XA CN109656950B (zh) | 2018-12-12 | 2018-12-12 | 递归查询方法、装置、服务器及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109656950A CN109656950A (zh) | 2019-04-19 |
CN109656950B true CN109656950B (zh) | 2020-08-07 |
Family
ID=66113979
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811517375.XA Active CN109656950B (zh) | 2018-12-12 | 2018-12-12 | 递归查询方法、装置、服务器及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109656950B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112445818A (zh) * | 2019-08-30 | 2021-03-05 | 拉扎斯网络科技(上海)有限公司 | 用于数据库系统的数据查询方法、装置、电子设备及介质 |
CN111159329B (zh) * | 2019-12-24 | 2023-09-08 | 深圳市优必选科技股份有限公司 | 敏感词检测方法、装置、终端设备和计算机可读存储介质 |
CN111949684B (zh) * | 2020-08-06 | 2023-08-11 | 上海达梦数据库有限公司 | Sql语句的执行方法、装置、设备和存储介质 |
CN113609154B (zh) * | 2021-08-06 | 2023-08-29 | 网易(杭州)网络有限公司 | 一种数据查询方法、装置、电子设备和存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1561484A (zh) * | 2001-09-26 | 2005-01-05 | 英特尔公司 | 实现快速类型检查的方法 |
CN101984439A (zh) * | 2010-12-09 | 2011-03-09 | 上海市共进通信技术有限公司 | 基于子查询实现数据源xml查询系统优化的方法 |
CN107766355A (zh) * | 2016-08-17 | 2018-03-06 | 腾讯科技(深圳)有限公司 | 层级数据管理方法、层级数据管理系统及即时通信系统 |
CN108431805A (zh) * | 2015-10-23 | 2018-08-21 | 甲骨文国际公司 | 并行执行具有递归子句的查询 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7774337B2 (en) * | 2006-07-11 | 2010-08-10 | Mediareif Moestl & Reif Kommunikations-Und Informationstechnologien Oeg | Method for controlling a relational database system |
-
2018
- 2018-12-12 CN CN201811517375.XA patent/CN109656950B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1561484A (zh) * | 2001-09-26 | 2005-01-05 | 英特尔公司 | 实现快速类型检查的方法 |
CN101984439A (zh) * | 2010-12-09 | 2011-03-09 | 上海市共进通信技术有限公司 | 基于子查询实现数据源xml查询系统优化的方法 |
CN108431805A (zh) * | 2015-10-23 | 2018-08-21 | 甲骨文国际公司 | 并行执行具有递归子句的查询 |
CN107766355A (zh) * | 2016-08-17 | 2018-03-06 | 腾讯科技(深圳)有限公司 | 层级数据管理方法、层级数据管理系统及即时通信系统 |
Also Published As
Publication number | Publication date |
---|---|
CN109656950A (zh) | 2019-04-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109656950B (zh) | 递归查询方法、装置、服务器及存储介质 | |
CN107247808B (zh) | 一种分布式NewSQL数据库系统及图片数据查询方法 | |
US8332389B2 (en) | Join order for a database query | |
US8396852B2 (en) | Evaluating execution plan changes after a wakeup threshold time | |
CN109508339B (zh) | 一种数据查询方法、装置、终端设备和存储介质 | |
Wu et al. | Efficiently translating complex SQL query to mapreduce jobflow on cloud | |
CN102426582B (zh) | 数据操作管理装置和数据操作管理方法 | |
US20070250517A1 (en) | Method and Apparatus for Autonomically Maintaining Latent Auxiliary Database Structures for Use in Executing Database Queries | |
CN110990425B (zh) | 硬件数据库的jdbc驱动方法及装置 | |
CN111125440B (zh) | 一种基于Monad的持久层复合条件查询方法与存储介质 | |
WO2021248319A1 (en) | Database management system and method for graph view selection for relational-graph database | |
CN112970011B (zh) | 记录查询优化中的谱系 | |
CN115114325B (zh) | 数据查询方法、装置、电子设备以及存储介质 | |
CN106991116A (zh) | 数据库执行计划的优化方法和装置 | |
CN109684351B (zh) | 一种执行计划查看方法、装置、服务器及存储介质 | |
US9135302B2 (en) | Query rewrite with a nested materialized view | |
US12072886B2 (en) | Method and device for accelerating database operation | |
CN107315801B (zh) | 并行离散事件仿真系统初始化数据存储方法 | |
CN107622070B (zh) | 一种数据库管理方法及装置 | |
US20190205448A1 (en) | Relational database system that uses real-time statistics for selection of physical operators | |
US9052883B2 (en) | Creating an object in an object-oriented programming platform | |
CN114924733A (zh) | 一种表单依赖关系管理和表单精准渲染方法和系统 | |
CN111046130B (zh) | 结合ElasticSearch和FSM的关联检索方法 | |
CN114547083A (zh) | 数据处理方法、装置及电子设备 | |
CN112882843A (zh) | 一种英文枚举自动补全中文值的方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |