CN108334571A - 层次查询的方法、装置、服务器及存储介质 - Google Patents
层次查询的方法、装置、服务器及存储介质 Download PDFInfo
- Publication number
- CN108334571A CN108334571A CN201810053058.0A CN201810053058A CN108334571A CN 108334571 A CN108334571 A CN 108334571A CN 201810053058 A CN201810053058 A CN 201810053058A CN 108334571 A CN108334571 A CN 108334571A
- Authority
- CN
- China
- Prior art keywords
- data
- value
- condition
- storehouse
- row
- 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.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/242—Query formulation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
- G06F16/2228—Indexing structures
- G06F16/2246—Trees, e.g. B+trees
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2455—Query execution
- G06F16/24564—Applying rules; Deductive queries
- G06F16/24566—Recursive queries
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computational Linguistics (AREA)
- Software Systems (AREA)
- Mathematical Physics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种层次查询的方法、装置、服务器及存储介质。该方法包括:S1、获取层次查询语句,并确定待查询的表和查询条件;S2、根据所述查询条件,确定所述待查询的表中的数据的第二条件值,并保存数据和第二条件值的对应关系;S3、从所述待查询的表中获取一行数据,作为驱动行;S4、根据所述查询条件确定所述驱动行的第一条件值,根据所述对应关系,确定第二条件值与所述第一条件值满足所述查询条件的数据,压入堆栈中,并输出所述驱动行的数据;S5、将从堆栈中弹出的一行数据作为驱动行,并执行S4,直到堆栈中的数据处理完毕,返回执行S3,直到所述待查询的表中的所有数据全部处理完毕。本发明提高了层次查询的效率。
Description
技术领域
本发明实施例涉及数据库技术,尤其涉及一种层次查询的方法、装置、服务器及存储介质。
背景技术
层次查询是一种数据库查询功能,使用树的遍历方式得到树型结构的数据集合,来获取树的层次关系报表。层次查询对于处理具有树型结构的层次化数据非常方便,主要用于返回一个数据集,这个数据集存在树的关系。
在数据库中进行层次查询时,对于每次进行查询用到查询条件时,都需要计算一次查询条件中的条件值,这样,对于选定的一行数据查询与该行数据具有层次关系的数据时,对于所有数据需要根据查询条件等号右侧的条件计算一次,再选定另一行数据查询与该行数据具有层次关系的数据时,还需要对所有数据根据查询条件等号右侧的条件重新计算一次,因此,对所有数据需要根据查询条件等号右侧的条件计算多次,导致查询效率较低。
发明内容
有鉴于此,本发明实施例提供一种层次查询的方法、装置、服务器及存储介质,以提高层次查询的效率。
第一方面,本发明实施例提供了一种层次查询的方法,所述方法包括:
S1、获取层次查询语句,并根据所述层次查询语句,确定待查询的表和查询条件;
S2、根据所述查询条件,确定所述待查询的表中的数据的第二条件值,并保存数据和第二条件值的对应关系;
S3、从所述待查询的表中获取一行数据,作为驱动行;
S4、根据所述查询条件确定所述驱动行的第一条件值,根据所述对应关系,确定第二条件值与所述第一条件值满足所述查询条件的数据,压入堆栈中,并输出所述驱动行的数据;
S5、将从堆栈中弹出的一行数据作为驱动行,并执行S4,直到堆栈中的数据处理完毕,返回执行S3,直到所述待查询的表中的所有数据全部处理完毕。
第二方面,本发明实施例还提供了一种层次查询的装置,所述装置包括:
查询确定模块,用于获取层次查询语句,并根据所述层次查询语句,确定待查询的表和查询条件;
数据条件值保存模块,用于根据所述查询条件,确定所述待查询的表中的数据的第二条件值,并保存数据和第二条件值的对应关系;
驱动行获取模块,用于从所述待查询的表中获取一行数据,作为驱动行;
层次查询模块,用于根据所述查询条件确定所述驱动行的第一条件值,根据所述对应关系,确定第二条件值与所述第一条件值满足所述查询条件的数据,压入堆栈中,并输出所述驱动行的数据;
递归模块,用于将从堆栈中弹出的一行数据作为驱动行,并重复触发层次查询模块,直到堆栈中的数据处理完毕,触发驱动行获取模块,直到所述待查询的表中的所有数据全部处理完毕。
第三方面,本发明实施例还提供了一种服务器,所述服务器包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序,
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现本发明任一实施例所述的层次查询的方法。
第四方面,本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现本发明任一实施例所述的层次查询的方法。
本发明实施例的技术方案,通过根据层次查询语句中的查询条件,确定待查询的表中的数据的第二条件值,并保存数据和第二条件值的对应关系,在每次查询与驱动行具体层次关系的数据时,不需要重新计算第二条件值,只需要在数据和第二条件值中查询与驱动行满足查询条件的第二条件值,便可以确定该第二条件值对应的数据,即可确定与驱动行满足查询条件的数据,从而提高了层次查询的效率,提升了性能。
附图说明
图1是本发明实施例一提供的一种层次查询的方法的流程图;
图2是本发明实施例二提供的一种层次查询的方法的流程图;
图3是本发明实施例三提供的一种层次查询的方法的流程图;
图4是本发明实施例中的表T数据对应的树型结构的示意图;
图5是本发明实施例六提供的一种层次查询的装置的结构示意图;
图6为本发明实施例七提供的一种服务器的结构示意图。
具体实施方式
下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部内容。
实施例一
图1是本发明实施例一提供的一种层次查询的方法的流程图,本实施例可适用于对数据库中的数据进行层次查询的情况,该方法可以由层次查询的装置来执行,该装置可以由软件和/或硬件来实现,一般可集成在数据库服务器等设备中,该方法具体包括如下步骤:
步骤101,获取层次查询语句,并根据所述层次查询语句,确定待查询的表和查询条件。
其中,层次查询的基本功能是将表中的每一行数据作为根节点,遍历并输出以当前根节点为根的子树的所有节点对应的数据。扩展功能可以包括指定一个根结点、对参加层次查询的数据进行过滤等等。
用户在需要进行层次查询时,可以输入层次查询语句。层次查询语句包括待查询的表和查询条件。在层次查询中,以PRIOR X=Y来定义树型结构的层次关系,即父与子关系,从而指定了层次查询的连接条件,也就是查询条件。如表T(ID INT,PID INT)有两个列:ID列和PID列,层次查询语句为“SELECT*FROM T CONNECT BY PRIOR ID=PID;”,可以确定待查询的表为表T,查询条件为PRIOR ID=PID,且该查询条件指定父节点的ID等于子节点的PID。待查询的表可以是一个表,还可以是至少两个表的连接。如层次查询语句“SELECT*FROM T1 LEFT JOIN T2 ON T1.ID=T2.ID CONNCT BY PRIOR T1.ID=T1.PID;”中进行层次查询的数据就来自于T1表和T2表的连接,即T1 LEFT JOIN T2 ON T1.ID=T2.ID。本发明实施例尤其适用于待查询的表为至少两个表的连接的情况。
其中,所述查询条件包括层次运算符和连接关系,所述连接关系是连接第一条件和第二条件的关系,第一条件即位于查询条件的等号左侧的列名或列表达式,第一条件值即驱动行中与查询条件的等号左侧的列名或列表达式对应的值,第二条件即位于查询条件的等号右侧的列名或列表达式,第二条件值即在待查询的表中查询条件的等号右侧的列名或列表达式对应的值。层次运算符为运算符PRIOR,从而查询条件由运算符PRIOR表示,PRIOR运算符放置在连接关系的第一条件或第二条件的前面。对于节点间的父子关系,PRIOR运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树型结构的顺序是自顶向下还是自底向上,如可以表示为PRIOR X=Y或X=PRIOR Y,PRIOR X=Y表示确定查找树型结构的顺序是自顶向下,X=PRIOR Y表示确定查找树型结构的顺序是自底向上。
步骤102,根据所述查询条件,确定所述待查询的表中的数据的第二条件值,并保存数据和第二条件值的对应关系。
针对待查询的表中的所有数据,分别计算第二条件值,并保存数据和第二条件值的对应关系。计算第二条件值时,针对第二条件为列名的情况,将该列名对应的列中的数据作为第二条件值,针对第二条件为列表达式的情况,将列表达式中对应列的数据进行列表达式指定的运算后得到的值作为第二条件值。将待查询的表中的数据和对应的第二条件值进行保存,后续可以直接使用,而不必在每次用到时单独进行计算,在每次用到时单独进行计算会导致多次重复计算。通过保存数据和第二条件值的对应关系特别适合于第二条件为列表达式的情况,避免了多次重复计算,可以提高查询效率,提升性能。
步骤103,从所述待查询的表中获取一行数据,作为驱动行。
其中,驱动行是指从待查询的表中顺序获取的数据,并以该行数据为准,获取与该行数据满足所述查询条件的数据。
按照顺序从所述待查询的表中获取一行数据,如先获取第一行数据,之后经过步骤104-步骤106的处理后,再返回该步骤时,再获取第二行数据,后续以此类推。并将获取到的一行数据作为驱动行,以该驱动行为准,查询与该驱动行满足所述查询条件的行数据,即计算驱动行的第一条件值(也称为左节点的值),左节点即位于查询条件中的等号左侧的列名或列表达式对应的值。如对于上述查询条件PRIOR ID=PID,计算驱动行的ID值,并查询PID值等于该驱动行的ID值的行数据。
步骤104,根据所述查询条件确定所述驱动行的第一条件值,根据所述对应关系,确定第二条件值与所述第一条件值满足所述查询条件的数据,压入堆栈中,并输出所述驱动行的数据。
根据查询条件,确定查询条件中的第一条件,并获取驱动行中第一条件对应的列中的数据,确定第一条件值。根据第一条件值在对应关系中查询与第一条件值满足所述查询条件的数据,即查询第二条件值与第一条件值相等的数据,将查询到的数据压入堆栈中,输出驱动行的数据。查询结束时,每次输出的驱动行的数据就组成本次层次查询的输出结果。通过将与驱动行的第一条件值满足查询条件的数据压入堆栈中,从而进行后续的层次关系查询。
例如,对于查询条件PRIOR ID=PID,计算驱动行的数据的ID值,作为第一条件值,并在数据与第二条件值的对应关系中查询第二条件值即PID值等于驱动行的ID值的行数据,作为与驱动行满足查询条件的数据。
其中,根据所述查询条件确定所述驱动行的第一条件值,在所述哈希表中探测,确定第二条件值与所述第一条件值相等的数据,压入堆栈中,可选包括:
根据所述查询条件确定所述驱动行的第一条件值,并将所述第一条件值保存到临时变量中;
在所述哈希表中探测,确定第二条件值与所述临时变量相等的数据,压入堆栈中。
通过将驱动行的第一条件值,赋值给临时变量,再次查询第二条件值与第一条件值满足查询条件的数据时,即查询第二条件值与第一条件值相等的数据时,可以只将第二条件值与临时变量的值进行比较,从而处理时比较统一,处理速度较快。
步骤105,判断堆栈中的数据是否处理完毕,如果是,则执行步骤107,如果否,则执行步骤106。
堆栈中还有未处理的数据时,先处理堆栈中的数据,即执行步骤106,在堆栈中的数据处理完毕时,执行步骤107。
步骤106,将从堆栈中弹出的一行数据作为驱动行,之后执行步骤104。
从堆栈中弹出一行数据,并将该行数据作为驱动行,执行步骤104-步骤105,继续查询与该驱动行满足查询条件的数据。
步骤107,判断所述待查询的表中的所有数据是否全部处理完毕,如果否,则返回执行步骤103。
对于待查询的表中还有未处理的数据时,执行步骤103,继续查询;在待查询的表中的所有数据均处理完毕即所有数据均计算了第一条件值并查询了对应的满足查询条件的数据时,结束查询,多次返回的驱动行的数据构成了树型结构的数据集。
本实施例的技术方案,通过根据层次查询语句中的查询条件,确定待查询的表中的数据的第二条件值,并保存数据和第二条件值的对应关系,在每次查询与驱动行具体层次关系的数据时,不需要重新计算第二条件值,只需要在数据和第二条件值中查询与驱动行满足查询条件的第二条件值,便可以确定该第二条件值对应的数据,即可确定与驱动行满足查询条件的数据,从而提高了层次查询的效率,提升了性能。
实施例二
图2是本发明实施例二提供的一种层次查询的方法的流程图,本实施例在上述实施例的基础上进行了优化,将保存数据和第二条件值的对应关系进一步优化为:将所述数据和第二条件值的对应关系保存到哈希表中,相应的,根据所述对应关系,确定第二条件值与所述第一条件值满足所述查询条件的数据,压入堆栈中,并输出所述驱动行的数据进一步优化为:在所述哈希表中探测,确定第二条件值与所述第一条件值满足所述查询条件的数据,压入堆栈中,并输出所述驱动行的数据。该方法具体包括如下步骤:
步骤201,获取层次查询语句,并根据所述层次查询语句,确定待查询的表和查询条件。
步骤202,根据所述查询条件,确定所述待查询的表中的数据的第二条件值,并将数据和第二条件值的对应关系保存到哈希表中。
其中,哈希表(Hash table,也称为散列表)是根据关键码值(Key value)而直接进行访问的数据结构。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
通过将数据和第二条件值的对应关系保存到哈希表中,可以提高后续查询与驱动行满足查询条件的数据的速度,从而提高层次查询的效率。
步骤203,从所述待查询的表中获取一行数据,作为驱动行。
步骤204,根据所述查询条件确定所述驱动行的第一条件值,在所述哈希表中探测,确定第二条件值与所述第一条件值满足所述查询条件的数据,压入堆栈中,并输出所述驱动行的数据。
在查询与第一条件值满足查询条件的第二条件值时,可以直接在哈希表中探测获取,确定第二条件值后,直接获取第二条件值对应的数据,作为与驱动行满足查询条件的数据,即第二天条件值与第一条件值满足查询条件的数据。
步骤205,判断堆栈中的数据是否处理完毕,如果是,则执行步骤207,如果否,则执行步骤206。
步骤206,将从堆栈中弹出的一行数据作为驱动行,之后执行步骤204。
从堆栈中弹出一行数据,并将该行数据作为驱动行,执行步骤204-步骤205,继续查询与该驱动行满足查询条件的数据。
步骤207,判断所述待查询的表中的所有数据是否全部处理完毕,如果否,则返回执行步骤203。
本实施例的技术方案,在上述实施例的基础上,通过在保存数据和第二条件值的对应关系时,将数据和第二条件值的对应关系保存到哈希表中,并在后续查询与驱动行满足查询条件的数据时,可以直接在哈希表中探测确定,从而提高了查询与驱动行满足查询条件的数据的速度,进一步提高了层次查询的效率。
在上述技术方案的基础上,在从所述查询的表中获取一行数据,作为驱动行之时,还可选包括:
确定所述驱动行的层次值;
相应的,在所述哈希表中探测,确定第二条件值与所述第一条件值满足所述查询条件的数据,压入堆栈中,并输出所述驱动行的数据,包括:
在哈希表中探测,确定第二条件值与所述第一条件值满足所述查询条件的数据,并确定该数据的层次值为所述驱动行的层次值加一;
将第二条件值与所述第一条件值满足所述查询条件的数据及对应的层次值压入堆栈中;
输出所述驱动行的数据及对应的层次值。
从所述待查询的表中获取一行数据,作为驱动行,并确定该驱动行的层次值,一般情况下,该驱动行的层次值为1,与驱动行满足查询条件的数据的层次值为驱动行的层次值加一,在将与驱动行满足查询条件的数据压入堆栈时,将该数据的层次值一同压入堆栈中,从而堆栈中保存了与驱动行满足查询条件的数据及对应的层次值,当再次从堆栈中获取一行数据作为驱动行时,可以直接获取到该驱动行的层次值。在输出驱动行的数据时还输出对应的层次值,从而可以使得输出的数据的层次更加清楚。
实施例三
图3是本发明实施例三提供的一种层次查询的方法的流程图,本实施例在上述实施例的基础上进行了优化,具体为,所述哈希表包括层次字段,所述层次字段用于记录对应数据的层次值,初始值为0;在所述哈希表中探测,确定第二条件值与所述第一条件值满足所述查询条件的数据,压入堆栈中,进一步包括:在所述哈希表中探测,确定第二条件值与所述第一条件值满足所述查询条件的数据,并确定该数据对应的当前层次值;在当前层次值与所述哈希表中层次字段记录的层次值不同时,将哈希表中层次字段记录的层次值更新为所述当前层次值,将对应的满足查询条件的数据压入堆栈中。该方法具体包括如下步骤:
步骤301,获取层次查询语句,并根据所述层次查询语句,确定待查询的表和查询条件。
在层次查询语句中包括去重处理时,可以应用本实施例的方案进行处理。如层次查询语句的查询项中包括DISTINCT X,可以应用本实施例的方案进行处理,即一行数据如果在一个层次值对应的层次被处理过,那么在这一层次值对应的层次中不需要再重复层次查询的过程,可以直接跳过这行数据,从而减少后续递归的数据量,提高效率。
步骤302,根据所述查询条件,确定所述待查询的表中的数据的第二条件值,并将数据和第二条件值的对应关系保存到哈希表中。
其中,所述哈希表包括层次字段,所述层次字段用于记录对应数据的层次值,初始值为0,并随着后续的处理更新为数据的当前层次值。层次字段记录的是对应数据的最新层次值。
步骤303,从所述待查询的表中获取一行数据,作为驱动行,并确定驱动行的层次值。
在确定驱动行的层次值后,更新哈希表的层次字段中记录的该驱动行的数据对应的层次值为确定的层次值。
步骤304,根据所述查询条件确定所述驱动行的第一条件值,在所述哈希表中探测,确定第二条件值与所述第一条件值满足所述查询条件的数据,并确定该数据的当前层次值为所述驱动行的层次值加一。
步骤305,在当前层次值与所述哈希表中层次字段记录的层次值不同时,将哈希表中层次字段记录的层次值更新为所述当前层次值,将对应的满足查询条件的数据及对应的当前层次值压入堆栈中。
在满足查询条件的数据对应的当前层次值与哈希表中该数据的层次字段记录的层次值不同时,将哈希表中层次字段记录的层次值更新为所述当前层次值,并将对应的满足查询条件的数据压入堆栈中。在当前层次值与哈希表中层次字段记录的层次值相同时,不必再将对应的满足查询条件的数据压入堆栈中,避免了重复处理。
步骤306,输出所述驱动行的数据及对应的层次值。
输出驱动行的数据时,将对应的层次值同时输出。
步骤307,判断堆栈中的数据是否处理完毕,如果是,则执行步骤309,如果否,则执行步骤308。
步骤308,将从堆栈中弹出的一行数据作为驱动行,之后执行步骤304。
从堆栈中弹出一行数据,并将该行数据作为驱动行,执行步骤304-步骤307,继续查询与该驱动行满足查询条件的数据。
步骤309,判断所述待查询的表中的所有数据是否全部处理完毕,如果否,则返回执行步骤303。
本实施例的技术方案,通过在哈希表中增加层次字段,用于记录与驱动行满足查询条件的数据对应的最新层次值,从而数据在一个层次值处理过时,哈希表中的层次字段可以记录该层次值,后续对应的当前层次值与记录的层次值相同时,可以不必重复处理,即不必再将该数据压入堆栈,从而节省了该数据从堆栈中弹出时作为驱动行去哈希表探测的过程,只处理数据的当前层次值与记录的层次值不同的数据,从而减少了递归的数据量,进一步提高了层次查询效率,当重复数据比例较大时可以大幅提升性能。
实施例四
本发明实施例四提供一种层次查询的方法,本实施例是在上述实施例基础上的一个优选实例,本实施例以待查询的表为表T1和表T2的连接为例,以T1 left join T2(即表T1左连接表T2)之后的数据为基础,表T1数据如下:
表1表T1数据
ID | PID |
1 | 1102 |
… | 1102 |
100000 | 1102 |
100001 | 1103 |
… | 1103 |
200000 | 1103 |
表T2数据如下:
表2表T2数据
ID | PID |
1 | 1201 |
… | … |
100000 | 101201 |
本实施例可以使用一个操作符CNNTB来实现层次查询的功能,输出层次查询的结果及每一行结果记录对应的层次值。层次查询实质上是一种特殊的自连接查询,进行层次查询的数据可以是一个表(如表T),也可以是至少两个表的连接。本实施例以两个表的连接为例。
该方法具体包括如下步骤:
获取到的层次查询语句为“SELECT*FROM T1 LEFT JOIN T2 ON T1.ID=T2.IDCONNCT BY PRIOR T1.ID+T2.PID=T1.PID+T2.ID;”;
根据层次查询语句,确定待查询的表为表T1和表T2的连接,即T1 left join T2,查询条件为PRIOR T1.ID+T2.PID=T1.PID+T2.ID;本实施例以T1 left join T2之后的数据为基础,层次查询中的查询条件的左右两侧都是T1 left join T2,层次查询的过滤条件是PRIOR T1.ID+T2.PID=T1.PID+T2.ID;
理论上,得到的T1 left join T2的结果数据如下:
表3 T1 left join T2的结果数据
T1.ID | T1.PID | T2.ID | T2.PID |
1 | 1102 | 1 | 1201 |
… | 1102 | … | … |
100000 | 1102 | 100000 | 101201 |
100001 | 1103 | NULL | NULL |
… | 1103 | NULL | NULL |
200000 | 1103 | NULL | NULL |
根据所述查询条件,确定待查询的表中的数据的第二条件值,并保存数据和第二条件值的对应关系到哈希表中;
待查询的表中的数据的第二条件值,即T1.PID+T2.ID的值,将每行数据对应的该值及对应的每行数据保存到哈希表中,后续查找与驱动行满足查询条件的数据时,可以直接在哈希表中探测得到,而不必再重复计算;哈希表的每个槽号(1,2,3,…)对应的键值为(1,2,3…)的行,不同的行可以在同一个槽中,优选不同的行在不同的槽中,即每行数据对应一个槽。将第二条件值即T1.PID+T2.ID的计算结果存入不同的槽中,当T1.PID+T2.ID为不同的值时,只要去不同的槽中找满足条件的数据即可,而不需要重做left join。
从待查询的表中获取第一行数据,作为驱动行,确定该驱动行的层次值为1;
根据查询条件,确定驱动行的第一条件值为T1.ID+T2.PID(1+1201=1202),将1202赋值给临时变量tmp,即tmp=1202;
在哈希表中探测,查找满足T1.PID+T2.ID=1202的行,查找到的数据为待查询的表中的第100行数据,即T1 left join T2后的第100行数据,该第100行数据对应的层次值为2,将该第100行数据压入堆栈中,并输出驱动行的数据和对应的层次值;
将从堆栈中弹出的一行数据作为驱动行,即待查询的表中的第100行数据,该数据对应的层次值为2;
根据查询条件,确定驱动行的第一条件值为T1.ID+T2.PID(100+1201=1302),将1302赋值给临时变量tmp,即tmp=1302;
依据上述方法,在哈希表中探测,查找满足T1.PID+T2.ID=1302的行,并将查询到的数据压入堆栈中,输出驱动行的数据和对应的层次值,再从堆栈中探测以后数据作为驱动行,进行上述的查询处理,直到堆栈中的数据处理完毕;
从待查询的表中获取下一行数据(即第二行数据)作为驱动行,按照上述方法进行处理,这里不再赘述。
本实施例的技术方案,通过给出一个具体实例表明了在待查询的表为两个表的连接且第二条件为列表打算时,通过哈希表来保存数据和第二条件值的对应关系,后续查询第二条件值与驱动行的第一条件值相等的数据时,不必每次单独计算第二条件值,可以直接在哈希表中探测得到,从而提高了层次查询的效率,提升了查询性能。
实施例五
本发明实施例五提供了一种层次查询的方法,本实施例是在上述实施例的基础上的一个优选实例。本实施例以待查询的表为表T为例,表T中数据如下:
表4表T中数据
ID | PID |
5 | 0 |
1 | 0 |
2 | 5 |
2 | 1 |
4 | 2 |
3 | 1 |
根据查询条件PRIOR ID=PID可知表T数据对应的树型结构如图4所示。本实施例可以使用一个操作符CNNTB来实现层次查询的功能,输出层次查询的结果及每一行结果记录对应的层次值。层次查询实质上是一种特殊的自连接查询,进行层次查询的数据可以是一个表(如表T),也可以是至少两个表的连接。
该方法具体包括如下步骤:
获取到的层次查询语句为“SELECT DISTINCT ID,PID FROM T CONNECT BY PRIORID=PID;”,查询项包括DISTINCT X;
根据层次查询语句,确定待查询的表为表T,查询条件为PRIOR ID=PID;
根据所述查询条件,计算所述待查询的表中的数据的第二条件值,并保存到哈希表中,哈希表中包括层次字段,用于记录对应数据的层次值,初始值为0,得到的数据为(5,0,0)、(1,0,0)、(2,5,0)、(2,1,0)、(4,2,0)、(3,1,0),其中的最后一列都为数据对应的层次值;
从所述待查询的表中获取一行数据(5,0),作为驱动行,并确定驱动行对应的层次值为1,更新哈希表中对应数据的层次值,即将(5,0,0)更新为(5,0,1);
根据查询条件PRIOR ID=PID,确定驱动行的第一条件值即ID值为5,将临时变量TMP置为5;
到哈希表中探测,取出满足第二条件值与临时变量相等即PID=TMP的数据(2,5),确定满足查询条件的数据对应的当前层次值为2,与哈希表中记录的层次值0不同,将哈希表中层次字段记录的层次值更新为当前层次值2,则哈希表中记录的数据为(2,5,2),将满足查询条件的数据压入堆栈中,输出驱动行的数据及对应的层次值(5,0,1),其中,最后一列1表示层次值;
从堆栈中弹出一行数据(2,5)作为驱动行,根据查询条件PRIOR ID=PID,确定驱动行的第一条件值即ID值为2,临时变量TMP置为2;
到哈希表中探测,取出满足第二条件值与临时变量相等即PID=TMP的数据(4,2),确定满足查询条件的数据对应的层次值为3,与哈希表中记录的层次值0不同,将哈希表中层次字段记录的层次值更新为当前层次值3,则哈希表中记录的数据为(4,2,3),将满足查询条件的数据压入堆栈中,输出驱动行的数据及对应的层次值(2,5,2),其中,最后一列2表示层次值;
从堆栈中弹出一行数据(4,2)作为驱动行,根据查询条件PRIOR ID=PID,确定驱动行的第一条件值即ID值为4,临时变量TMP置为4;
到哈希表中探测,没有满足第二条件值与临时变量相等即PID=TMP的数据,输出驱动行的数据及对应的层次值(4,2,3),其中,最后一列3表示层次值;
堆栈中的数据已处理完毕,从所述待查询的表中获取下一行数据(1,0),作为驱动行,并确定驱动行对应的层次值为1,更新哈希表中对应数据的层次值,即将(1,0,0)更新为(1,0,1);
根据查询条件PRIOR ID=PID,确定驱动行的第一条件值即ID值为1,将临时变量TMP置为1;
到哈希表中探测,取出满足第二条件值与临时变量相等即PID=TMP的数据(2,1)和(3,1),并压入堆栈中,确定满足查询条件的数据对应的层次值为2,更新哈希表中记录的层次值,即将(2,1,0)和(3,1,0)分别更新为(2,1,2)和(3,1,2),输出驱动行的数据及对应的层次值(1,0,1),其中,最后一列1表示层次值;
从堆栈中弹出一行数据(3,1)作为驱动行,根据查询条件PRIOR ID=PID,确定驱动行的第一条件值即ID值为3,临时变量TMP置为3;
到哈希表中探测,没有满足第二条件值与临时变量相等即PID=TMP的数据,输出驱动行的数据及对应的层次值(3,1,2),其中,最后一列2表示层次值;
从堆栈中弹出一行数据(2,1)作为驱动行,根据查询条件PRIOR ID=PID,确定驱动行的第一条件值即ID值为2,临时变量TMP置为2;
到哈希表中探测,确定满足第二条件值与临时变量相等即PID=TMP的数据(4,2),确定满足查询条件的数据对应的当前层次值为3,由于哈希表中记录的层次值与当前层次值相同,那么跳过数据(4,2),不用将该数据压入堆栈,输出驱动行的数据及对应的层次值(2,1,2);
后续步骤以此类推,不再详述。
本实施例的技术方案,当一行数据在同一层次值被多次处理时,从第二次开始就可以不用将该数据压入堆栈,节省了该行数据从堆栈中弹出时作为驱动行去哈希表探测的过程,当重复数据比例较大时,可以大幅提升性能及层次查询的效率。
实施例六
图5是本发明实施例六提供的一种层次查询的装置的结构示意图,本实施例可适用于对数据库中的数据进行层次查询的情况,该装置可以由软件和/或硬件来实现,一般可集成在数据库服务器等设备中。如图5所示,本实施例所述的层次查询的装置包括:查询确定模块501、数据条件值保存模块502、驱动行获取模块503、层次查询模块504和递归模块505。
其中,查询确定模块501,用于获取层次查询语句,并根据所述层次查询语句,确定待查询的表和查询条件;
数据条件值保存模块502,用于根据所述查询条件,确定所述待查询的表中的数据的第二条件值,并保存数据和第二条件值的对应关系;
驱动行获取模块503,用于从所述待查询的表中获取一行数据,作为驱动行;
层次查询模块504,用于根据所述查询条件确定所述驱动行的第一条件值,根据所述对应关系,确定第二条件值与所述第一条件值满足所述查询条件的数据,压入堆栈中,并输出所述驱动行的数据;
递归模块505,用于将从堆栈中弹出的一行数据作为驱动行,并重复触发层次查询模块,直到堆栈中的数据处理完毕,触发驱动行获取模块,直到所述待查询的表中的所有数据全部处理完毕。
可选的,所述数据条件值保存模块包括:
哈希表保存单元,用于将所述数据和第二条件值的对应关系保存到哈希表中;
所述层次查询模块具体用于:
根据所述查询条件确定所述驱动行的第一条件值,在所述哈希表中探测,确定第二条件值与所述第一条件值满足所述查询条件的数据,压入堆栈中,并输出所述驱动行的数据。
可选的,还包括:
层次值确定模块,用于在从所述待查询的表中获取一行数据,作为驱动行之时,确定所述驱动行的层次值;
所述层次查询模块包括:
层次查询单元,用于在哈希表中探测,确定第二条件值与所述第一条件值满足所述查询条件的数据,并确定该数据的当前层次值为所述驱动行的层次值加一;
数据压入堆栈单元,用于将第二条件值与所述第一条件值满足所述查询条件的数据及对应的当前层次值压入堆栈中;
数据输出单元,用于输出所述驱动行的数据及对应的层次值。
可选的,所述哈希表包括层次字段,所述层次字段用于记录对应数据的层次值,初始值为0;
所述数据压入堆栈单元具体用于:
在当前层次值与所述哈希表中层次字段记录的层次值不同时,将哈希表中层次字段记录的层次值更新为所述当前层次值,将对应的满足查询条件的数据及对应的当前层次值压入堆栈中。
可选的,所述层次查询模块包括:
第一条件值确定单元,用于根据所述查询条件确定所述驱动行的第一条件值,并将所述第一条件值保存到临时变量中;
层次查询单元,用于在所述哈希表中探测,确定第二条件值与所述临时变量相等的数据,压入堆栈中。
上述层次查询的装置可执行本发明任意实施例所提供的层次查询的方法,具备执行方法相应的功能模块和有益效果。未在本实施例中详尽描述的技术细节,可参见本发明任意实施例提供的层次查询的方法。
实施例七
图6为本发明实施例七提供的一种服务器的结构示意图,如图6所示,该服务器包括处理器601、存储器602、输入装置603和输出装置604;服务器中处理器601的数量可以是一个或多个,图6中以一个处理器601为例;服务器中的处理器601、存储器602、输入装置603和输出装置604可以通过总线或其他方式连接,图6中以通过总线连接为例。
存储器602作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序以及模块,如本发明实施例中的层次查询的方法对应的程序指令/模块(例如,层次查询的装置中的查询确定模块501、数据条件值保存模块502、驱动行获取模块503、层次查询模块504和递归模块505)。处理器601通过运行存储在存储器602中的软件程序、指令以及模块,从而执行服务器的各种功能应用以及数据处理,即实现上述的层次查询的方法。
存储器602可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作***、至少一个功能所需的应用程序;存储数据区可存储根据服务器的使用所创建的数据等。此外,存储器602可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储器602可进一步包括相对于处理器601远程设置的存储器,这些远程存储器可以通过网络连接至服务器。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
输入装置603可用于接收输入的数字或字符信息,以及产生与服务器的用户设置以及功能控制有关的键信号输入。输出装置604可包括显示屏等显示设备。
实施例八
本发明实施例八还提供一种包含计算机可执行指令的存储介质,所述计算机可执行指令在由计算机处理器执行时用于执行一种层次查询的方法,该方法包括:
S1、获取层次查询语句,并根据所述层次查询语句,确定待查询的表和查询条件;
S2、根据所述查询条件,确定所述待查询的表中的数据的第二条件值,并保存数据和第二条件值的对应关系;
S3、从所述待查询的表中获取一行数据,作为驱动行;
S4、根据所述查询条件确定所述驱动行的第一条件值,根据所述对应关系,确定第二条件值与所述第一条件值满足所述查询条件的数据,压入堆栈中,并输出所述驱动行的数据;
S5、将从堆栈中弹出的一行数据作为驱动行,并执行S4,直到堆栈中的数据处理完毕,返回执行S3,直到所述待查询的表中的所有数据全部处理完毕。
当然,本发明实施例所提供的一种包含计算机可执行指令的存储介质,其计算机可执行指令不限于如上所述的方法操作,还可以执行本发明任意实施例所提供的层次查询的方法中的相关操作。
通过以上关于实施方式的描述,所属领域的技术人员可以清楚地了解到,本发明可借助软件及必需的通用硬件来实现,当然也可以通过硬件实现,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如计算机的软盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(RandomAccess Memory,RAM)、闪存(FLASH)、硬盘或光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
值得注意的是,上述层次查询的装置的实施例中,所包括的各个单元和模块只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能单元的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。
注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。
Claims (10)
1.一种层次查询的方法,其特征在于,所述方法包括:
S1、获取层次查询语句,并根据所述层次查询语句,确定待查询的表和查询条件;
S2、根据所述查询条件,确定所述待查询的表中的数据的第二条件值,并保存数据和第二条件值的对应关系;
S3、从所述待查询的表中获取一行数据,作为驱动行;
S4、根据所述查询条件确定所述驱动行的第一条件值,根据所述对应关系,确定第二条件值与所述第一条件值满足所述查询条件的数据,压入堆栈中,并输出所述驱动行的数据;
S5、将从堆栈中弹出的一行数据作为驱动行,并执行S4,直到堆栈中的数据处理完毕,返回执行S3,直到所述待查询的表中的所有数据全部处理完毕。
2.根据权利要求1所述的方法,其特征在于,保存数据和第二条件值的对应关系包括:
将所述数据和第二条件值的对应关系保存到哈希表中;
根据所述对应关系,确定第二条件值与所述第一条件值满足所述查询条件的数据,压入堆栈中,并输出所述驱动行的数据包括:
在所述哈希表中探测,确定第二条件值与所述第一条件值满足所述查询条件的数据,压入堆栈中,并输出所述驱动行的数据。
3.根据权利要求2所述的方法,其特征在于,在从所述待查询的表中获取一行数据,作为驱动行之时,还包括:
确定所述驱动行的层次值;
在所述哈希表中探测,确定第二条件值与所述第一条件值满足所述查询条件的数据,压入堆栈中,并输出所述驱动行的数据,包括:
在哈希表中探测,确定第二条件值与所述第一条件值满足所述查询条件的数据,并确定该数据的当前层次值为所述驱动行的层次值加一;
将第二条件值与所述第一条件值满足所述查询条件的数据及对应的当前层次值压入堆栈中;
输出所述驱动行的数据及对应的层次值。
4.根据权利要求3所述的方法,其特征在于,所述哈希表包括层次字段,所述层次字段用于记录对应数据的层次值,初始值为0;
将第二条件值与所述第一条件值满足所述查询条件的数据及对应的当前层次值压入堆栈中,包括:
在当前层次值与所述哈希表中层次字段记录的层次值不同时,将哈希表中层次字段记录的层次值更新为所述当前层次值,将对应的满足查询条件的数据及对应的当前层次值压入堆栈中。
5.根据权利要求1-4任一所述的方法,其特征在于,根据所述查询条件确定所述驱动行的第一条件值,在所述哈希表中探测,确定第二条件值与所述第一条件值相等的数据,压入堆栈中,包括:
根据所述查询条件确定所述驱动行的第一条件值,并将所述第一条件值保存到临时变量中;
在所述哈希表中探测,确定第二条件值与所述临时变量相等的数据,压入堆栈中。
6.一种层次查询的装置,其特征在于,所述装置包括:
查询确定模块,用于获取层次查询语句,并根据所述层次查询语句,确定待查询的表和查询条件;
数据条件值保存模块,用于根据所述查询条件,确定所述待查询的表中的数据的第二条件值,并保存数据和第二条件值的对应关系;
驱动行获取模块,用于从所述待查询的表中获取一行数据,作为驱动行;
层次查询模块,用于根据所述查询条件确定所述驱动行的第一条件值,根据所述对应关系,确定第二条件值与所述第一条件值满足所述查询条件的数据,压入堆栈中,并输出所述驱动行的数据;
递归模块,用于将从堆栈中弹出的一行数据作为驱动行,并重复触发层次查询模块,直到堆栈中的数据处理完毕,触发驱动行获取模块,直到所述待查询的表中的所有数据全部处理完毕。
7.根据权利要求6所述的装置,其特征在于,所述数据条件值保存模块包括:
哈希表保存单元,用于将所述数据和第二条件值的对应关系保存到哈希表中;
所述层次查询模块具体用于:
根据所述查询条件确定所述驱动行的第一条件值,在所述哈希表中探测,确定第二条件值与所述第一条件值满足所述查询条件的数据,压入堆栈中,并输出所述驱动行的数据。
8.根据权利要求7所述装置,其特征在于,还包括:
层次值确定模块,用于在从所述待查询的表中获取一行数据,作为驱动行之时,确定所述驱动行的层次值;
所述层次查询模块包括:
层次查询单元,用于在哈希表中探测,确定第二条件值与所述第一条件值满足所述查询条件的数据,并确定该数据的当前层次值为所述驱动行的层次值加一;
数据压入堆栈单元,用于将第二条件值与所述第一条件值满足所述查询条件的数据及对应的当前层次值压入堆栈中;
数据输出单元,用于输出所述驱动行的数据及对应的层次值。
9.一种服务器,其特征在于,所述服务器包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序,
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如权利要求1-5中任一所述的层次查询的方法。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1-5中任一所述的层次查询的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810053058.0A CN108334571A (zh) | 2018-01-19 | 2018-01-19 | 层次查询的方法、装置、服务器及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810053058.0A CN108334571A (zh) | 2018-01-19 | 2018-01-19 | 层次查询的方法、装置、服务器及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN108334571A true CN108334571A (zh) | 2018-07-27 |
Family
ID=62926466
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810053058.0A Pending CN108334571A (zh) | 2018-01-19 | 2018-01-19 | 层次查询的方法、装置、服务器及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108334571A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113297255A (zh) * | 2021-06-23 | 2021-08-24 | 建信金融科技有限责任公司 | 一种数据处理方法和装置 |
WO2023000994A1 (zh) * | 2021-07-23 | 2023-01-26 | 北京奥星贝斯科技有限公司 | 层次查询方法及装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1828585A (zh) * | 2005-03-04 | 2006-09-06 | 英业达股份有限公司 | 多层次查询***以及方法 |
US20140250111A1 (en) * | 2008-04-24 | 2014-09-04 | Lexisnexis Risk Solutions Fl Inc. | External Linking Based On Hierarchical Level Weightings |
CN105378724A (zh) * | 2014-06-10 | 2016-03-02 | 华为技术有限公司 | 一种数据查询方法、装置及*** |
CN106294573A (zh) * | 2016-07-28 | 2017-01-04 | Tcl集团股份有限公司 | 一种海量数据实时查询方法及*** |
-
2018
- 2018-01-19 CN CN201810053058.0A patent/CN108334571A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1828585A (zh) * | 2005-03-04 | 2006-09-06 | 英业达股份有限公司 | 多层次查询***以及方法 |
US20140250111A1 (en) * | 2008-04-24 | 2014-09-04 | Lexisnexis Risk Solutions Fl Inc. | External Linking Based On Hierarchical Level Weightings |
CN105378724A (zh) * | 2014-06-10 | 2016-03-02 | 华为技术有限公司 | 一种数据查询方法、装置及*** |
CN106294573A (zh) * | 2016-07-28 | 2017-01-04 | Tcl集团股份有限公司 | 一种海量数据实时查询方法及*** |
Non-Patent Citations (1)
Title |
---|
惠玉洁 等: ""层次查询功能在Oracle数据库中的应用"", 《航空计算技术》 * |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113297255A (zh) * | 2021-06-23 | 2021-08-24 | 建信金融科技有限责任公司 | 一种数据处理方法和装置 |
WO2023000994A1 (zh) * | 2021-07-23 | 2023-01-26 | 北京奥星贝斯科技有限公司 | 层次查询方法及装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Yagoubi et al. | Massively distributed time series indexing and querying | |
US9256665B2 (en) | Creation of inverted index system, and data processing method and apparatus | |
CN106156168A (zh) | 在跨分区数据库中查询数据的方法及跨分区查询装置 | |
Agarwal et al. | Approximate incremental big-data harmonization | |
CN101727465A (zh) | 分布式列存储数据库索引建立、查询方法及装置与*** | |
US10169386B2 (en) | Devices and methods for processing network nodes | |
CN109791543B (zh) | 执行多表连接操作的控制方法及对应装置 | |
JP7041348B2 (ja) | 学習プログラム及び学習方法 | |
CN104268295A (zh) | 一种数据查询方法及装置 | |
CN106933897B (zh) | 数据查询方法和装置 | |
CN106599107A (zh) | 获得用户行为的方法、装置及服务器 | |
US20090222408A1 (en) | Data storage structure | |
Zhang et al. | Fast inbound top-k query for random walk with restart | |
CN108334571A (zh) | 层次查询的方法、装置、服务器及存储介质 | |
CN115328883B (zh) | 一种数据仓库建模方法和*** | |
KR20160130489A (ko) | 다차원 온라인 분석 처리 시스템에서의 큐브를 재구성하는 방법 및 장치 | |
Hamad et al. | Knowledge-driven decision support system based on knowledge warehouse and data mining for market management | |
CN108108379B (zh) | 关键词拓词的方法及装置 | |
Zhang et al. | Distance-aware selective online query processing over large distributed graphs | |
CN117093633A (zh) | 表格数据库导入方法、装置、设备、存储介质和程序产品 | |
CN110019357B (zh) | 数据库查询脚本生成方法及装置 | |
CN110020181B (zh) | 一种推荐信息的处理方法、装置及计算机可读存储介质 | |
US20160117350A1 (en) | Column group selection method and apparatus for efficiently storing data in mixed olap/oltp workload environment | |
CN107622070A (zh) | 一种数据库管理方法及装置 | |
CN108334570A (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 | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20180727 |