一种SQL脚本快速编写方法及系统与流程

文档序号:28741325发布日期:2022-02-07 22:11阅读:202来源:国知局
一种sql脚本快速编写方法及系统
技术领域
:1.本发明涉及大数据智能化
技术领域
:,特别是一种sql脚本快速编写方法及系统。
背景技术
::2.sql是一门ansi的标准计算机结构化查询语言,用来访问和操作各类数据库系统。sql代码包含了丰富的技术口径信息,比如表的限制条件、不同表之间的关联关系(主外键关系),这些信息都没有直观地体现在sql代码中,需要经过sql解析才能让计算机进行识别。技术实现要素:3.本发明为解决上述问题,提供了一种sql脚本快速编写方法及系统,经过整合梳理将相关的计算口径信息存储下来并进行后续应用,可以提高后续sql代码的编写效率和准确性,也利于分析不同数据之间的关系。4.为实现上述目的,本发明采用的技术方案为:5.一种sql脚本快速编写系统,包括:第一提取模块,用于提取sql脚本中的表关联关系;第二提取模块,用于提取所述sql脚本中的表限制条件;第一整合模块,用于整合所述表关联关系,得到常用表关联关系;第二整合模块,用于整合所述表限制条件,得到常用表限制条件;第一输出模块,用于输出第一目标表和第二目标表的所述常用表关联关系;第二输出模块,用于输出第三目标表的所述常用表限制条件。6.优选的,所述系统还包括优化模块,用于将所述sql脚本补充完整,并根据制定的xpath规则进行封装。7.优选的,所述第一整合模块采用统计学算法。8.优选的,所述表关联关系进行双向增益。9.优选的,所述第二整合模块采用监督学习算法,对所述表限制条件进行特征化处理。10.优选的,所述表限制条件的特征值分别根据字段中文名判定类型、字段类型、限制条件、限制值长度和前文环境获得。11.优选的,所述字段中文名判定类型包括日期常量、可罗列字符常量、数值常量和其他类。12.优选的,所述监督学习算法为xgboost算法。13.优选的,如果所述常用表限制条件不准确时,手动干预所述监督学习算法。14.基于同样的发明构思,本发明还提供了一种sql脚本快速编写方法,包括以下步骤:提取sql脚本中的表关联关系;提取所述sql脚本中的表限制条件;整合所述表关联关系,得到常用表关联关系;整合所述表限制条件,得到常用表限制条件;输出第一目标表和第二目标表的所述常用表关联关系;输出第三目标表的所述常用表限制条件。15.本发明的有益效果是:16.1.提取sql代码中的表关联关系和表限制条件,整合得到常用表关联关系和常用表限制条件,应用于后续sql代码编写;17.2.表关联关系进行双向增益,保证整合的信息的完整性;18.3.采用监督学习算法优化常用表限制条件的整合效果。附图说明19.图1为一种补充完整的sql结构的示例图;20.图2为一种用于存储形变后的ast语法解析树的xml格式的大字段的示意图;21.图3为sql编辑器的右键菜单图。具体实施方式22.为了使本发明所要解决的技术问题、技术方案及有益效果更加清楚、明白,以下结合具体实施例对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。23.sql代码的编写基本上是etl开发人员根据业务需求及系统设计、取数口径进行编写。历史写过的sql往往包含了大量可复用的信息(口径、关联关系、限制条件、参数变量等)。但是,实际在进行sql编写的过程中,如果没有系统的支持,无法继承使用这些信息。24.实施例一25.本实施例公开了一种sql脚本快速编写系统,包括:26.优化模块,用于将sql脚本补充完整,并根据制定的xpath规则进行封装。27.优化模块对sql进行遍历,与数据库的元数据库进行匹配,对sql中每个层次使用的库、表、字段信息进行补充完整。28.参照附图1,本实施例作为示例的sql代码如下,记为sql1:29.selecta.a1,b130.fromaaa31.innerjoinbb32.ona.a1=b33.wherea.a2=‘s’andb.b2=134.优化模块的操作具体包括:针对节点属性为表的节点,扩充节点的第一子节点,第一子节点的节点属性为表中文名,值为该表对应中文名。35.针对节点属性为字段的节点,扩充节点的第二子节点,第二子节点的节点属性为字段中文名,值为该字段对应中文名。36.针对节点属性为字段的节点,扩充节点的第三子节点,第三子节点的节点属性为字段类型,值为该字段对应字段类型。37.针对节点属性为表的节点,如果没有节点属性为表别名的兄弟节点,扩展节点的第一兄弟节点,第一兄弟节点的节点属性为表别名,值为该表对应别名。如果已有这个兄弟节点,不额外扩展,直接复用。38.针对节点属性为字段的节点,如果没有节点属性为字段别名的兄弟节点,扩展节点的第二兄弟节点,第二兄弟节点的节点属性为字段别名,值为该字段对应别名。如果已有这个兄弟节点,不额外扩展,直接复用。39.针对节点属性为字段的节点,如果没有节点属性为归属表别名的兄弟节点,扩展节点的第三兄弟节点,第三兄弟节点的节点属性为归属表别名,值为该字段归属的表对应别名。如果已有这个兄弟节点,不额外扩展,直接复用。40.由于sql解析树存在于内存中(java类),无法有效存储,遍历比较困难,属性提取不直观,并不适宜后续应用。在本实施例中,根据所有sql结构,建立一个用于存储sql解析树的结构(sql知识库结构),该结构具备可二维化存储、有灵活的遍历方式、可重新还原成sql、可快速提取相关信息等能力,后续方便使用,并设计一个可以使用xpath语法进行遍历的大字段,用于存储该结构。41.在本实施例中,优化模块按照制定的xpath规则,将补充完整的sql按照xml格式进行封装并保存到数据库二维表中。42.该xpath规则主要属性类型包括:43.root根节点、ddlstatementddl语句、dmlstatementdml语句、simpleselect简单查询语句、queryspecification查询描述、selectelements查询元素列表、fullcolumnname字段、fullcolumncnname字段中文名、fullcolumntype字段类型、fromclausefrom语句块、tablesources库名、tablesourcebase表来源、atomtableitem原子表、tablename表名、tablecnname表中文名、fullid完整id、uid唯一id、simpleid简单id、outerjoin外连接、tnode终结符、subquerytableitem子查询表、comparisonoperator比较运算符、predicateexpression判别表达式、binarycomparasionpredicate二元比较判别、expressionatompredicate原子表达式判别、constantexpressionatom常量表达式判别、constant常量、decimalliteral数字等。44.将单段sql语句保存在数据库二维表中的一行的xml里。将多段sql语句或sql脚本根据sql序号,将分割成的多个单段sql语句分开保存到多行的xml里。45.第一提取模块,用于提取sql脚本中的表关联关系。46.在本实施例中,使用xpath规则访问数据库二维表,获取的结构如表1所示。具体的,xpath规则是提取comparisonoperator(等式)值为=,并且等式左右两边的tablesourcebase.tablename.fullcolumnnam(字段)归属于不同的表。47.表1sql1表关联关系48.表名字段名关联表名关联字段名关联关系aaa1bbb1“=”49.第一整合模块,用于整合表关联关系,得到常用表关联关系。50.首先,在本实施例中,对表关联关系进行处理。由于关联的方向是相对的,对相关信息进行双向增益,如表2所示(其中还有另一段代码sql2也登记了类似的表关联关系)。51.表2双向增益表关联关系[0052][0053]双向增益可以对另一个方向的关联关系进行补充,保证整合的信息的完整性,以便进行后续应用。[0054]由于表关联关系在一个数据库应该是相对稳定的,因此表关联关系可以采用统计学算法来进行整合。具体为,统计两个关联表中某一添加出现的概率,保留达到预定的阈值的表关联关系,作为常用表关联关系。确定的表关联关系,即常用表关联关系登记如表3所示。[0055]表3常用表关联关系[0056]表名字段名关联表名关联字段名关联关系概率aaa1bbb1“=”0.667bbb1aaa1“=”0.667[0057]存储常用表关联关系用于第一输出模块在sql代码编写时进行推荐。[0058]其中,当出现第一输出模块的推荐错误的时候,根据具体需要,可以调整阈值,从而获得相对正确的常用表关联关系。[0059]第二提取模块,用于提取sql脚本中的表限制条件。[0060]在本实施例中,使用xpath规则访问数据库二维表,获取的结构如表4所示。具体的,xpath规则是提取comparisonoperator(等式)值为=,并且等式左右分别为tablesourcebase.tablename.fullcolumnname(字段)和constant(常量)。[0061]表4sql1表限制条件[0062]表名字段名限制条件限制值aaa2“=”‘s’bbb2“》”1[0063]第二整合模块,用于整合表限制条件,得到常用表限制条件。[0064]针对表限制条件,由于通常sql语句中关于表的限制条件非常多,干扰信息多(比如一个casewhen语句,可能会包含十几个限制条件),如果简单的套用统计学算法,一来无法设置合理的阈值从而导致整合错误,二来常用限制条件可能随着时间一直在改变(比如有段时间大家都在写“a国总统=‘bcd’”,过段时间就是“a国总统=‘ef’”),因此第二提取模块提取的信息还是不够的,需要进一步补充特征信息。由于复杂度问题,之后的表限制条件信息根据表5所示的结构进行模拟。[0065]表5表限制条件[0066][0067][0068]其中,字段中文名判定类型:根据字段的英文名称+字段的中文名称+字段类型综合判定,由于系统中常用表限制条件一般只在日期常量、可罗列字符常量、数值常量之间,根据元数据信息对字段进行业务分类,可以把无法明确判别的类型全部标注为其他类。[0069]对表限制条件信息进行特征化处理。其中,[0070]1、序列id使用表id(表在元数据库id)+字段id(字段在元数据库id)组合获得。[0071]2、特征值1由字段中文名判定类型转化获得,规则如表6所示。[0072]表6字段中文名判定类型特征转化规则[0073]原值特征值1特征转化方法日期常量10直接指定数值常量20直接指定可罗列字符常量30直接指定其他类40直接指定[0074]3、特征值2由字段类型转化获得,规则如表7所示。[0075]表7字段类型特征转化规则[0076]原值特征值2特征转换方法date10直接指定char(8\16\24)20\21\22直接指定,每10个长度加1int30直接指定string40直接指定[0077]4、特征值3由限制条件转化获得,规则如表8所示。[0078]表8限制条件特征转化规则[0079][0080][0081]5、特征值4由限制值长度直接获得。[0082]6、特征值5由转化获得,规则如表9所示。[0083]表9出现前文环境特征转化规则[0084]原值特征值5特征转换方法where子句10直接指定casewhen子句20直接指定on子句30直接指定or子句40直接指定[0085]7、常用条件进行人工标注(有监督)。[0086]最终获得的学习样本如表10所示。[0087]表10学习样本[0088]序列id特征值1特征值2特征值3特征值4特征值5常用条件11102101010810y22202202020110y11102101010820n11102101010820n11102101010820n11102101010830n11102101010810y22201202020110y11101302010240n11103302110230n11104302210230n11103101010830n11104402010830n[0089]采用监督学习算法整合表限制条件。可以采用的监督学习算法决策树、逻辑回顾、随机森林、xgboost、支持向量机、贝叶斯等。在本实施例中,采用xgboost算法,其最终模型验证效果更好、性能更高。对上述学习样本进行训练并获得机器学习模型。[0090]使用机器学习模型对输入的表限制条件进行判定,保留所有常用条件结果为y的信息,并对相同或者相似的记录进行合并。最终获得的常用表限制条件的结构如表11所示。其中,判定结果会根据模型输入自动优化。[0091]表11常用表限制条件[0092]表名字段名常用限制值aaa2=‘x’bbb2》‘x’[0093]存储常用表限制条件用于第二输出模块在sql代码编写时进行推荐。[0094]其中,当出现第二输出模块的推荐不准确的时候,可以手动干预模型的判定结果,重新标注相关样本后进行训练。[0095]第一输出模块,用于输出第一目标表和第二目标表的常用表关联关系。[0096]在系统框架底下(web化的sql编辑器),所有的sql开发人员在编写代码的时候通过手动或者自动对当前sql进行补充,补充的信息可包含插入语句的表字段、关联语句的表关联关系、限制语句的表限制条件等,从而实现知识的继承,保证代码的准确性和编码的高效性。[0097]过往人工写条件和关联,需要对业务及表设计有比较深入的了解,并且进行多次数据的验证。通过本实施例所述的系统的辅助编写,既可以实现知识在不同人之间的继承,也提高了sql代码编写的效率和准确性。[0098]当选择2张或者多张表,并选择关联条件功能时,将第一张和最后一张表作为目标表,并且分别去匹配第一整合模块获得的常用表关联关系中的表名跟关联表名,组装sql进行输出(输出aa.a1=bb.b1,此部分即该功能的补充内容)。如果无法匹配,则输出无相关记录。[0099]或者,第一输出模块、第二输出模块和第三输出模块可以监控用户输入界面,自动触发相关功能,并进行sql的快速编写。[0100]当用户输入ajoinb子句时,自动触发关联条件功能,输出a和b的表关联条件。[0101]同时,第二输出模块输出b的常用表限制条件。[0102]第二输出模块,用于输出第三目标表的常用表限制条件。[0103]当选择1张或者多张表,并选择限制条件功能时,将最后一张表作为目标表,并且同第二整合模块获得的该表的常用表限制条件进行匹配,组装sql进行输出(输出aa.a2=‘x’,此部分即该功能的补充内容,一般一个表的常用表限制条件会有3-4个,而上述模拟的时候为了简便,只体现了一个条件,实际场景会复杂一点,输出多个常用表限制条件)。如果无法匹配,则输出无相关记录。[0104]或者,当用户输入一张表+where子句时,自动触发限制条件功能,输出该表的常用表限制条件。[0105]另外,本实施例所述的系统还可以包括第三输出模块,用于输出第四目标表的所有字段。[0106]当选择1张或者多张表,并选择insert功能时,将最后一张表作为目标表,并且通过查询其元数据库结构并进行字段拼装,最终输出其所有字段(a1,a2,a3,a4,a5,此部分即该功能的补充内容)。[0107]或者,当用户输入insertintotablea时,自动触发insert功能,补充相关insert字段:insertintotablea(a1,a2,a3,a4,a5)。[0108]本实施例所述的系统可以使sql开发人员在编写代码的过程中获得支持(历史sql、批量脚本、他人写的代码等整合后的信息),从而快速获得正确的口径、关联关系、限制条件等,提高sql代码编写的效率和准确性。[0109]本实施例所述的系统可以降低业务人员使用sql语言进行自助取数的门槛,通过数据库支撑,使更多的人具备编写sql代码的能力。[0110]实施例二[0111]本实施例公开了一种sql脚本快速编写方法,包括以下步骤:[0112]s1.将sql结构补充完整。[0113]对sql进行遍历,与数据库的元数据库进行匹配,对sql中每个层次使用的库、表、字段信息进行补充完整。[0114]按照制定的xpath规则,将补充完整的sql按照xml格式进行封装并保存到数据库二维表中。[0115]s2.提取sql脚本中的表关联关系。[0116]s3.提取sql脚本中的表限制条件。[0117]使用xpath规则访问上述数据库二维表,分别获取表关联关系和表限制条件。[0118]s4.整合表关联关系,得到常用表关联关系。[0119]对获取的表关联关系进行双向增益。采用统计学算法整合处理后的信息。统计两个关联表中某一添加出现的概率,保留达到预定的阈值的表关联关系,作为常用表关联关系。[0120]s5.整合表限制条件,得到常用表限制条件。[0121]对表限制条件信息进行特征化处理。采用监督学习算法整合处理后的信息。在本实施例中,采用xgboost算法。[0122]对学习样本进行人工标注后,训练获得机器学习模型。通过使用机器学习模型对输入的表限制条件进行判定,获取常用表限制条件。[0123]存储常用表关联关系和常用表限制条件用于后续步骤的代码推荐。[0124]s6.输出第一目标表和第二目标表的常用表关联关系。[0125]在系统框架底下(web化的sql编辑器),通过手动或者自动将目标表与常用表关联关系的结构进行匹配,组装sql进行输出。[0126]s7.输出第三目标表的常用表限制条件。[0127]在系统框架底下(web化的sql编辑器),通过手动或者自动匹配目标表的常用表限制条件,组装sql进行输出。[0128]s8.输出第四目标表的所有字段。[0129]上述说明示出并描述了本发明的优选实施例,应当理解本发明并非局限于本文所披露的形式,不应看作是对其他实施例的排除,而可用于各种其他组合、修改和环境,并能够在本文发明构想范围内,通过上述教导或相关领域的技术或知识进行改动。而本领域人员所进行的改动和变化不脱离本发明的精神和范围,则都应在本发明所附权利要求的保护范围内。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1