非标准SQL语句的内外连接的转化方法和转化装置与流程

文档序号:12063802阅读:197来源:国知局
非标准SQL语句的内外连接的转化方法和转化装置与流程

本发明涉及数据库技术领域,具体而言,涉及一种非标准SQL语句的内外连接的转化方法和一种非标准SQL语句的内外连接的转化装置。



背景技术:

在数据库移植过程中,有些用户使用了非ANSI(American National Standards Institute,美国国家标准协会)标准语法编写了SQL(Structured Query Language,结构化查询语言)语句,下面将使用非ANSI标准语法编写的SQL语句称为非标准SQL语句。由于年代久远,用户无法再次对非标准SQL语句进行修改编译,这就要求后来数据库能够兼容被移植数据库的语法。

在Oracle数据库中支持一种特殊的外连接语法,例如:Select*from a,b where a.c1=b.c1(+);其中(+)是Oracle新增的关键字,c1是表的列,b是被(+)修饰的表,a是未被(+)修饰的表,a.c1=b.c1(+)用来表示a表left join b表,连接条件是a.c1=b.c1,就是以外连接的方式查找出所有表a的c1列等于表b的c1列的行。若用户使用了以上的非标准SQL语句对表进行外连接查询,则当数据库需要移植时,由于应用程序中的非标准SQL语句不能被修改,所以新数据库需要兼容Oracle的这种非标准语法。如果不进行兼容性修改,那么数据库移植后,原有的应用程序将无法正确运行。上面的例子如果忽略掉(+)关键字,按照SQL标准语法,此非标准SQL语句会解析为内连接。但是在Oracle中,此非标准SQL语句会被解析成外连接。

因此,如何将非标准SQL语句的内连接转化成与其等价的外连接,从而保证数据库移植后查询语句的正确性成为亟待解决的技术问题。



技术实现要素:

本发明旨在至少解决现有技术或相关技术中存在的技术问题之一。

为此,本发明的一个目的在于提出了一种非标准SQL语句的内外连接的转化方法。

本发明的另一个目的在于提出了一种非标准SQL语句的内外连接的转化装置。

为实现上述至少一个目的,根据本发明的第一方面的实施例,提出了一种非标准SQL语句的内外连接的转化方法,包括:在非标准SQL语句的语法解析树中的过滤条件树中,查找出所有的第一类型表达式和所有的第二类型表达式,其中,所述第一类型表达式仅包括一个被预设关键字修饰的表,所述第二类型表达式仅包括一个被预设关键字修饰的表和一个未被所述预设关键字修饰的表;为每个所述第二类型表达式生成连接状态树节点;将所有的所述连接状态树节点进行合并,得到连接状态树;将每个所述第一类型表达式链接到所述连接状态树上的所述连接状态树节点的属性中;根据链接有所述第一类型表达式的连接状态树,对所述语法解析树进行修改,以将所述非标准SQL语句的内连接(Inner join)转化成外连接(Outer join)。

在该技术方案中,通过生成能够描述非标准SQL语句的语法解析树中的表与表之间的外连接关系的连接状态树,以根据该连接状态树,将非标准SQL语句的内连接转化成与其等价的外连接,从而保证数据库移植后查询语句的正确性。另外,本方案既不会影响原有的语法解析流程,也不会对优化器造成任何影响,而且在实施本方案时,不会对数据库执行流程做过多的修改,减小了新功能开发的风险。

在上述技术方案中,优选地,所述连接状态树节点的属性包括:被所述预设关键字修饰的表、未被所述预设关键字修饰的表、被所述预设关键字修饰的表和未被所述预设关键字修饰的表之间的连接条件、所述连接状态树节点的左侧连接状态树节点、所述连接状态树节点的右侧连接状态树节点以及所述左侧连接状态树节点和所述右侧连接状态树节点是否为空连接。

在该技术方案中,根据上述中的连接状态树节点的属性,对所有的连接状态树节点进行合并,从而得到连接状态树,而该连接状态树描述了非标准SQL语句的语法解析树中的表与表之间的外连接关系。

在上述任一技术方案中,优选地,所述将每个所述第一类型表达式链接到所述连接状态树上的所述连接状态树节点的属性中的步骤,包括:在所述连接状态树中查找出每个所述第一类型表达式对应的所述连接状态树节点,其中,所述第一类型表达式的被所述预设关键字修饰的表和所述第一类型表达式对应的所述连接状态树节点的被所述预设关键字修饰的表相同;将每个所述第一类型表达式链接到其对应的所述连接状态树节点的所述连接条件中。

在该技术方案中,通过将每个第一类型表达式链接到其对应的连接状态树节点的被预设关键字修饰的表和未被预设关键字修饰的表之间的连接条件中,从而实现第一类型表达式在连接状态树上的重分发。

在上述任一技术方案中,优选地,所述将所有的所述连接状态树节点进行合并,得到连接状态树的步骤,包括:在将所有的所述连接状态树节点中的第一连接状态树节点和其右侧的第二连接状态树节点进行合并时,将所述第一连接状态树节点作为目标节点,所述第二连接状态树节点作为参与节点,判断所述目标节点和所述参与节点是否满足左合并条件或右合并条件;若所述目标节点和所述参与节点满足所述左合并条件或所述右合并条件,则将所述参与节点向所述目标节点进行合并;若所述目标节点和所述参与节点不满足所述左合并条件和所述右合并条件,则将所述参与节点更改为第一连接状态树节点,将所述目标节点更改为第二连接状态树节点,判断更改后的目标节点和参与节点是否满足所述左合并条件或所述右合并条件;若更改后的目标节点和参与节点满足所述左合并条件或所述右合并条件,则将更改后的参与节点向更改后的目标节点进行合并;若更改后的目标节点和参与节点不满足所述左合并条件和所述右合并条件,则将更改后的目标节点和更改后的参与节点进行空合并。

在该技术方案中,按照以上规则对所有的连接状态树节点进行合并,得到一棵完整的连接状态树,以使连接状态树描述了语法解析树中的多个表之间的外连接关系,从而根据该连接状态树将非标准SQL语句的内连接转化成与其等价的外连接。

在上述任一技术方案中,优选地,所述转化方法还包括:若在所述过滤条件树中,查找出除所述第一类型表达式和所述第二类型表达式之外的其他类型的表达式,且所述其他类型的表达式中包括被所述预设关键字修饰的表,则提示用户出现错误。

在该技术方案中,若查找出包括有被预设关键字修饰的表的其他类型的表达式,则提示用户出现错误,以使用户及时地针对错误采取相应措施。

根据本发明的第二方面的实施例,提出了一种非标准SQL语句的内外连接的转化装置,包括:查找单元,用于在非标准SQL语句的语法解析树中的过滤条件树中,查找出所有的第一类型表达式和所有的第二类型表达式,其中,所述第一类型表达式仅包括一个被预设关键字修饰的表,所述第二类型表达式仅包括一个被预设关键字修饰的表和一个未被所述预设关键字修饰的表;生成单元,用于为每个所述第二类型表达式生成连接状态树节点;合并单元,用于将所有的所述连接状态树节点进行合并,得到连接状态树;链接单元,用于将每个所述第一类型表达式链接到所述连接状态树上的所述连接状态树节点的属性中;转化单元,用于根据链接有所述第一类型表达式的连接状态树,对所述语法解析树进行修改,以将所述非标准SQL语句的内连接转化成外连接。

在该技术方案中,通过生成能够描述非标准SQL语句的语法解析树中的表与表之间的外连接关系的连接状态树,以根据该连接状态树,将非标准SQL语句的内连接转化成与其等价的外连接,从而保证数据库移植后查询语句的正确性。另外,本方案既不会影响原有的语法解析流程,也不会对优化器造成任何影响,而且在实施本方案时,不会对数据库执行流程做过多的修改,减小了新功能开发的风险。

在上述技术方案中,优选地,所述连接状态树节点的属性包括:被所述预设关键字修饰的表、未被所述预设关键字修饰的表、被所述预设关键字修饰的表和未被所述预设关键字修饰的表之间的连接条件、所述连接状态树节点的左侧连接状态树节点、所述连接状态树节点的右侧连接状态树节点以及所述左侧连接状态树节点和所述右侧连接状态树节点是否为空连接。

在该技术方案中,根据上述中的连接状态树节点的属性,对所有的连接状态树节点进行合并,从而得到连接状态树,而该连接状态树描述了非标准SQL语句的语法解析树中的表与表之间的外连接关系。

在上述任一技术方案中,优选地,所述链接单元具体用于,在所述连接状态树中查找出每个所述第一类型表达式对应的所述连接状态树节点,其中,所述第一类型表达式的被所述预设关键字修饰的表和所述第一类型表达式对应的所述连接状态树节点的被所述预设关键字修饰的表相同,将每个所述第一类型表达式链接到其对应的所述连接状态树节点的所述连接条件中。

在该技术方案中,通过将每个第一类型表达式链接到其对应的连接状态树节点的被预设关键字修饰的表和未被预设关键字修饰的表之间的连接条件中,从而实现第一类型表达式在连接状态树上的重分发。

在上述任一技术方案中,优选地,所述合并单元具体用于,在将所有的所述连接状态树节点中的第一连接状态树节点和其右侧的第二连接状态树节点进行合并时,将所述第一连接状态树节点作为目标节点,所述第二连接状态树节点作为参与节点,判断所述目标节点和所述参与节点是否满足左合并条件或右合并条件;若所述目标节点和所述参与节点满足所述左合并条件或所述右合并条件,则将所述参与节点向所述目标节点进行合并;若所述目标节点和所述参与节点不满足所述左合并条件和所述右合并条件,则将所述参与节点更改为第一连接状态树节点,将所述目标节点更改为第二连接状态树节点,判断更改后的目标节点和参与节点是否满足所述左合并条件或所述右合并条件;若更改后的目标节点和参与节点满足所述左合并条件或所述右合并条件,则将更改后的参与节点向更改后的目标节点进行合并;若更改后的目标节点和参与节点不满足所述左合并条件和所述右合并条件,则将更改后的目标节点和更改后的参与节点进行空合并。

在该技术方案中,按照以上规则对所有的连接状态树节点进行合并,得到一棵完整的连接状态树,以使连接状态树描述了语法解析树中的多个表之间的外连接关系,从而根据该连接状态树将非标准SQL语句的内连接转化成与其等价的外连接。

在上述任一技术方案中,优选地,所述转化装置还包括:提示单元,用于若所述查找单元在所述过滤条件树中,查找出除所述第一类型表达式和所述第二类型表达式之外的其他类型的表达式,且所述其他类型的表达式中包括被所述预设关键字修饰的表,则提示用户出现错误。

在该技术方案中,若查找出包括有被预设关键字修饰的表的其他类型的表达式,则提示用户出现错误,以使用户及时地针对错误采取相应措施。

通过本发明的技术方案,能够将非标准SQL语句的内连接转化成与其等价的外连接,从而保证数据库移植后查询语句的正确性。

附图说明

图1示出了根据本发明的一个实施例的非标准SQL语句的内外连接的转化方法的流程示意图;

图2示出了根据本发明的实施例的连接状态树节点的属性的示意图;

图3A至图3C示出了根据本发明的实施例的连接状态树节点的合并规则的示意图;

图4A至图4D示出了根据本发明的实施例的内连接转化成外连接的示意图;

图5示出了根据本发明的一个实施例的非标准SQL语句的内外连接的转化装置的结构示意图。

具体实施方式

为了可以更清楚地理解本发明的上述目的、特征和优点,下面结合附图和具体实施方式对本发明进行进一步的详细描述。需要说明的是,在不冲突的情况下,本申请的实施例及实施例中的特征可以相互组合。

在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是,本发明还可以采用其他不同于在此描述的其他方式来实施,因此,本发明的保护范围并不受下面公开的具体实施例的限制。

图1示出了根据本发明的一个实施例的非标准SQL语句的内外连接的转化方法的流程示意图。

如图1所示,根据本发明的一个实施例的非标准SQL语句的内外连接的转化方法,包括:

步骤102,在非标准SQL语句的语法解析树中的过滤条件树中,查找出所有的第一类型表达式和所有的第二类型表达式,其中,所述第一类型表达式仅包括一个被预设关键字修饰的表,所述第二类型表达式仅包括一个被预设关键字修饰的表和一个未被所述预设关键字修饰的表。

例如,预设关键字为(+),通过Parser(剖析器)对使用(+)修饰的表进行标记,根据该标记在非标准SQL语句的语法解析树中的过滤条件树中,查找被(+)修饰的表所在的表达式。若该表达式中仅包括一个被(+)修饰的表,则该表达式为第一类型表达式;若该表达式中仅包括一个被(+)修饰的表和一个未被(+)修饰的表,该表达式为第二类型表达式。

步骤104,为每个所述第二类型表达式生成连接状态树节点。

在一个实施例中,根据获取的第二类型表达式的被预设关键字修饰的表和未被所述预设关键字修饰的表,生成连接状态树节点。

优选地,所述连接状态树节点的属性包括:被所述预设关键字修饰的表、未被所述预设关键字修饰的表、被所述预设关键字修饰的表和未被所述预设关键字修饰的表之间的连接条件、所述连接状态树节点的左侧连接状态树节点、所述连接状态树节点的右侧连接状态树节点以及所述左侧连接状态树节点和所述右侧连接状态树节点是否为空连接。

例如,预设关键字为(+),则连接状态树节点的属性如图2所示,连接状态树节点的属性包括:被(+)修饰的表、未被(+)修饰的表、被(+)修饰的表和未被(+)修饰的表之间的连接条件、连接状态树节点的左侧连接状态树节点、连接状态树节点的右侧连接状态树节点、左侧连接状态树节点和右侧连接状态树节点之间是否为空连接。

步骤106,将所有的所述连接状态树节点进行合并,得到连接状态树。

优选地,步骤106包括:在将所有的所述连接状态树节点中的第一连接状态树节点和其右侧的第二连接状态树节点进行合并时,将所述第一连接状态树节点作为目标节点,所述第二连接状态树节点作为参与节点,判断所述目标节点和所述参与节点是否满足左合并条件或右合并条件。其中,该右合并条件为:目标节点(即第一连接状态树节点)的被预设关键字修饰的表和参与节点(即第二连接状态树节点)的未被预设关键字修饰的表相同,该左合并条件为:参与节点(即第二连接状态树节点)的未被预设关键字修饰的表和目标节点(即第一连接状态树节点)的未被预设关键字修饰的表相同。

若所述目标节点和所述参与节点满足所述左合并条件或所述右合并条件,则将所述参与节点向所述目标节点进行合并。

若所述目标节点和所述参与节点不满足所述左合并条件和所述右合并条件,则将所述参与节点更改为第一连接状态树节点,将所述目标节点更改为第二连接状态树节点,判断更改后的目标节点和参与节点是否满足所述左合并条件或所述右合并条件。其中,该右合并条件为:更改后的目标节点(即第二连接状态树节点)的被预设关键字修饰的表和更改后的参与节点(即第一连接状态树节点)的未被预设关键字修饰的表相同,该左合并条件为:更改后的参与节点(即第一连接状态树节点)的未被预设关键字修饰的表和更改后的目标节点(即第二连接状态树节点)的未被预设关键字修饰的表相同。

若更改后的目标节点和参与节点满足所述左合并条件或所述右合并条件,则将更改后的参与节点向更改后的目标节点进行合并;若更改后的目标节点和参与节点不满足所述左合并条件和所述右合并条件,则将更改后的目标节点和更改后的参与节点进行空合并。

按照以上规则对所有的连接状态树节点进行合并,得到一棵完整的连接状态树,以使连接状态树描述了语法解析树中的多个表之间的外连接关系。

下面进一步地说明以上的技术方案。

首先从所有的连接状态树节点中选择出两个连接状态树节点,左侧的连接状态树节点为第一连接状态树节点,右侧的连接状态树节点为第二连接状态树节点,将第一连接状态树节点和第二连接状态树进行合并,得到中间连接状态树。然后将中间连接状态树作为第一连接状态树节点,从未参与合并的连接状态树节点中取出一个节点作为第二连接状态树节点,对第一连接状态树节点和第二连接状态树节点进行合并,直到所有的连接状态树节点都被合并完成时为止,以得到完整的连接状态树。

另外,当将中间连接状态树作为第一连接状态树节点,从未参与合并的连接状态树节点中取出一个节点作为第二连接状态树节点时,若中间连接状态树的根节点的属性为空连接,则在第一连接状态树节点和第二连接状态树节点进行合并得到一个新的中间连接状态树之后,将新的中间连接状态树的根节点的左树和右树进行合并。如果合并成功,并且新的中间连接状态树的根节点依然为空连接,则继续进行中间连接状态树的根节点的左树和右树进行合并,直到中间连接状态树的根节点的属性不是空连接或者合并失败时为止。而且如果合并失败,则不对中间连接状态树进行修改,本次连接状态树的合并结束。

除此之外,参与合并的还可以是两个中间连接状态树。两个中间连接状态树之间合并的步骤具体包括:

从第一中间连接状态树中选择目标节点(该目标节点的度小于2),从第二中间连接状态树中选取根节点作为参与节点,判断目标节点和参与节点是否满足左合并条件或者右合并条件。

若目标节点和参与节点满足左合并条件或者右合并条件,则将参与节点向目标节点进行合并。

若目标节点和参与节点不满足左合并条件或者右合并条件,则从第一中间连接状态树中选择下一个度小于2的节点作为目标节点,将该目标节点与参与节点再次进行合并,若合并成功,则本次合并完成,若合并失败,并且第一连接状态树的所有度小于2的节点都作为目标节点与参与节点合并失败,则从第二中间连接状态树中选择度小于2的节点作为目标节点,从第一中间连接状态树中选取根节点作为参与节点,重复进行上述的第一中间连接状态树和第二中间连接状态树的合并过程。若合并失败,则将第一中间连接状态树的根节点和第二中间连接状态树的根节点进行空合并。

下面以预设关键字为(+)对两个连接状态树节点之间的左合并、右合并和空合并进行详细说明。

如图3A所示,参与节点为ALB,目标节点为BLC,参与节点和目标节点满足右合并条件,目标节点的被(+)修饰的表和参与节点的未被(+)修饰的表相同,将参与节点ALB向目标节点BLC进行合并,即A=B(+)and B=C(+),其中(+)是非标准SQL语句中的预设关键字,参与节点中的A是未被(+)修饰的表,B是被(+)修饰的表,目标节点中的B是未被(+)修饰的表,C是被(+)修饰的表。

如图3B所示,参与节点为ALB,目标节点为ALC,参与节点和目标节点满足左合并条件,参与节点的未被(+)修饰的表和目标节点的未被(+)修饰的表相同,将参与节点ALB向目标节点ALC进行合并,即A=B(+)and A=C(+),其中(+)是非标准SQL语句中的预设关键字,目标节点中的A是未被(+)修饰的表,C是被(+)修饰的表,参与节点中的A是未被(+)修饰的表,B是被(+)修饰的表。

如图3C所示,参与节点为ALB,目标节点为CLD,参与节点ALB和目标节点CLD既不满足左合并条件,也不满足右合并条件,则将目标节点更改为ALB,将参与节点更改为CLD,判断目标节点ALB和参与节点CLD是否满足左合并条件或者右合并条件,若目标节点ALB和参与节点CLD既不满足左合并条件,也不满足右合并条件,则将目标节点ALB和参与节点CLD进行空合并,即A=B(+)and C=D(+),其中(+)是非标准SQL语句中的预设关键字,ALB中的A是未被(+)修饰的表,B是被(+)修饰的表,CLD中的C是未被(+)修饰的表,D是被(+)修饰的表。

当链接有第一类型表达式的连接状态树生成完毕后,如果连接状态树中依然有空连接,则该空连接表示两个连接状态树节点的连接关系为内连接。

步骤108,将每个所述第一类型表达式链接到所述连接状态树上的所述连接状态树节点的属性中。

优选地,步骤108包括:在所述连接状态树中查找出每个所述第一类型表达式对应的所述连接状态树节点,其中,所述第一类型表达式的被所述预设关键字修饰的表和所述第一类型表达式对应的所述连接状态树节点的被所述预设关键字修饰的表相同;将每个所述第一类型表达式链接到其对应的所述连接状态树节点的属性中的所述连接条件中。

通过将每个第一类型表达式链接到其对应的连接状态树节点的被预设关键字修饰的表和未被预设关键字修饰的表之间的连接条件中,从而实现第一类型表达式在连接状态树上的重分发。

例如,第一类型表达式中被预设关键字修饰的表是A,以A表为参照,去连接状态树中遍历每个连接状态树节点,直到查找出满足以下条件的连接状态树节点:该连接状态树节点的被预设关键字修饰的表与第一类型表达式中被预设关键字修饰的表A相同,然后将第一类型表达式链接到该连接状态树节点的被预设关键字修饰的表和未被预设关键字修饰的表之间的连接条件中。

步骤110,根据链接有所述第一类型表达式的连接状态树,对所述语法解析树进行修改,以将所述非标准SQL语句的内连接(Inner join)转化成外连接(Outer join)。

在本方案的一个实施例所应用的数据库中,如果两个表A和B是内连接的关系,则这两个表之间的连接关系如图4A所示。如果两个表A和B是外连接的关系,则这两个表之间的连接关系如图4B所示,其中NULL表示空节点。

步骤110根据链接有所述第一类型表达式的连接状态树,对所述语法解析树进行修改,以将非标准SQL语句的内连接转化成外连接具体包括:在原有的语法解析树的表连接关系上,查找所有连接状态树上的被预设关键字修饰的表和未被预设关键字修饰的表,把这些表从语法解析树的表连接关系上删除。根据链接有第一类型表达式的连接状态树,按照图4B,生成表之间的外连接关系,其中,连接状态树中的被预设关键字修饰的表和未被预设关键字修饰的表之间的连接条件,被赋予给图4D中的NULL节点,表示两个表之间的外连接条件。把生成的表之间的外连接关系,链接到语法解析树的表连接关系中,完成对语法解析树的修改。例如,链接有第一类型表达式的连接状态树如图4C所示,根据该连接状态树生成表之间的外连接关系,该外连接关系如图4D所示,将该外连接关系链接到语法解析树的表连接关系中。

在上述技术方案中,通过生成能够描述非标准SQL语句的语法解析树中的表与表之间的外连接关系的连接状态树,以根据该连接状态树,将非标准SQL语句的内连接转化成与其等价的外连接,从而保证数据库移植后查询语句的正确性。另外,本方案既不会影响原有的语法解析流程,也不会对优化器造成任何影响,而且在实施本方案时,不会对数据库执行流程做过多的修改,减小了新功能开发的风险。

图5示出了根据本发明的一个实施例的非标准SQL语句的内外连接的转化装置的结构示意图。

如图5所示,根据本发明的一个实施例的非标准SQL语句的内外连接的转化装置500,包括:查找单元502、生成单元504、合并单元506、链接单元508和转化单元510。

查找单元502,用于在非标准SQL语句的语法解析树中的过滤条件树中,查找出所有的第一类型表达式和所有的第二类型表达式,其中,所述第一类型表达式仅包括一个被预设关键字修饰的表,所述第二类型表达式仅包括一个被预设关键字修饰的表和一个未被所述预设关键字修饰的表。

生成单元504,用于为每个所述第二类型表达式生成连接状态树节点。

优选地,所述连接状态树节点的属性包括:被所述预设关键字修饰的表、未被所述预设关键字修饰的表、被所述预设关键字修饰的表和未被所述预设关键字修饰的表之间的连接条件、所述连接状态树节点的左侧连接状态树节点、所述连接状态树节点的右侧连接状态树节点以及所述左侧连接状态树节点和所述右侧连接状态树节点是否为空连接。

根据上述中的连接状态树节点的属性,对所有的连接状态树节点进行合并,从而得到连接状态树,而该连接状态树描述了非标准SQL语句的语法解析树中的表与表之间的外连接关系。

合并单元506,用于将所有的所述连接状态树节点进行合并,得到连接状态树。

优选地,所述合并单元506具体用于,在将所有的所述连接状态树节点中的第一连接状态树节点和其右侧的第二连接状态树节点进行合并时,将所述第一连接状态树节点作为目标节点,所述第二连接状态树节点作为参与节点,判断所述目标节点和所述参与节点是否满足左合并条件或右合并条件;若所述目标节点和所述参与节点满足所述左合并条件或所述右合并条件,则将所述参与节点向所述目标节点进行合并;若所述目标节点和所述参与节点不满足所述左合并条件和所述右合并条件,则将所述参与节点更改为第一连接状态树节点,将所述目标节点更改为第二连接状态树节点,判断更改后的目标节点和参与节点是否满足所述左合并条件或所述右合并条件;若更改后的目标节点和参与节点满足所述左合并条件或所述右合并条件,则将更改后的参与节点向更改后的目标节点进行合并;若更改后的目标节点和参与节点不满足所述左合并条件和所述右合并条件,则将更改后的目标节点和更改后的参与节点进行空合并。

按照以上规则对所有的连接状态树节点进行合并,得到一棵完整的连接状态树,以使连接状态树描述了语法解析树中的多个表之间的外连接关系,从而根据该连接状态树将非标准SQL语句的内连接转化成与其等价的外连接。

链接单元508,用于将每个所述第一类型表达式链接到所述连接状态树上的所述连接状态树节点的属性中。

优选地,所述链接单元508具体用于,在所述连接状态树中查找出每个所述第一类型表达式对应的所述连接状态树节点,其中,所述第一类型表达式的被所述预设关键字修饰的表和所述第一类型表达式对应的所述连接状态树节点的被所述预设关键字修饰的表相同,将每个所述第一类型表达式链接到其对应的所述连接状态树节点的所述连接条件中。

通过将每个第一类型表达式链接到其对应的连接状态树节点的被预设关键字修饰的表和未被预设关键字修饰的表之间的连接条件中,从而实现第一类型表达式在连接状态树上的重分发。

转化单元510,用于根据链接有所述第一类型表达式的连接状态树,对所述语法解析树进行修改,以将所述非标准SQL语句的内连接转化成外连接。

在上述技术方案中,优选地,所述非标准SQL语句的内外连接的转化装置500还包括:提示单元512,用于若所述查找单元502在所述过滤条件树中,查找出除所述第一类型表达式和所述第二类型表达式之外的其他类型的表达式,且所述其他类型的表达式中包括被所述预设关键字修饰的表,则提示用户出现错误。

若查找出包括有被预设关键字修饰的表的其他类型的表达式,则提示用户出现错误,以使用户及时地针对错误采取相应措施。

在该技术方案中,通过生成能够描述非标准SQL语句的语法解析树中的表与表之间的外连接关系的连接状态树,以根据该连接状态树,将非标准SQL语句的内连接转化成与其等价的外连接,从而保证数据库移植后查询语句的正确性。另外,本方案既不会影响原有的语法解析流程,也不会对优化器造成任何影响,而且在实施本方案时,不会对数据库执行流程做过多的修改,减小了新功能开发的风险。

由于此非标准SQL语句的内外连接的转化装置解决问题的原理与前述非标准SQL语句的内外连接的转化方法相似,因此该转化装置的实施可以参见前述转化方法的实施,重复之处不再赘述。

以上结合附图详细说明了本发明的技术方案,通过本发明的技术方案,能够将非标准SQL语句的内连接转化成与其等价的外连接,从而保证数据库移植后查询语句的正确性。

以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1