复杂sql语句的生成方法

文档序号:6558244阅读:505来源:国知局
专利名称:复杂sql语句的生成方法
复杂SQL语句的生成方法
技术 领域本发明涉及一种SQL语句的生成方法,特别是一种复杂SQL语句的生成方法。
背景技术
文献“SQL生成器的设计与实现[J].计算机工程与设计.2006. Vol. 27(11) P2024-2027”公开了一种SQL语句的生成方法,该方法基于SQL92标准,能够实现复杂的SQL 语句的生成。首先根据用户指定的数据库表字段和SQL子句、函数或表达式等条件,进行完整性和重复性检查,然后根据SQL92标准拼出特定的符合要求的SQL语句。该方法可以简化SQL语句的生成过程,提高数据库应用程序的开发效率。但是要求用户必须掌握SQL语句的语法和各种复杂表达式的构成方法,输入正确的参数才能得到所需的SQL语句,使用起来较为复杂。其次,该方法只能实现针对指定表字段的SQL语句,不能实现针对指定SQL 组合关键字的SQL语句,因此,在数据库测试领域无法应用。

发明内容
为了克服现有的SQL语句的生成方法不能生成根据组合关键字的复杂SQL语句的不足,本发明提供一种SQL语句的生成方法,该方法以Postgres数据库测试集为基础,通过对SQL关键字分类、组合、设计基础SQL语句和生成方法,来根据用户指定的关键字自动生成复杂的SQL语句,可以生成根据组合关键字的复杂SQL语句。本发明解决其技术问题所采用的技术方案是一种SQL语句的生成方法,其特点是采用以下步骤(a)构建基础SQL语句select*from tl ; (1)select id from tl where id = 1 ; (2)select distinct id, name from tl where id > = lorder by id ; (3)select count (id), sum (id), avg (id), max (id), min (id) from tl group by name having count (id) > Oorder by id ; (4)select*from tl, t2 ; (5)select氺from tl natural join t2 on tl. id = t2. id ; (6)select*from tl join t2 using(id) ; (7)select氺from tl left outer join t2 using(id) ; (8)select氺from tl right outer join t2 using (id) ; (9)select*from tl where id = (select id from tl where id = 1) ; (10)(b)构建SQL关键字列表KeyWordsList和SQL语句列表SQLList KeyffordsList = {用户指定的组合SQL关键字},SQLList = {};(c)关键字分组,关键字按照匹配原则归属于四个组
单表查询={with, select,distinct,as,from, where,group by, having, order by, limit,offset,sum,count,min,max, avg};多表连接查询={natural,join,on, using};多表交、并、差集查询={intersect,union,except, };子查询={select,from, where, select};(d)对于单表 查询,根据输入关键字从基础SQL语句(1) (4)中查找包含特定关键字的语句加入SQLList,关键字列表减去生成语句中包含的SQL语句,执行步骤(i);(e)对于多表连接查询,执行下面流程生成SQL语句,加入SQLList,关键字列表减去生成语句中包含的SQL语句,执行步骤(i);stepl 计算连接关键字个数N,根据输入关键字从自定义基础SQL语句(5) (9) 中选择包含指定关键字的SQL语句;st印2 如果是N = 1,直接返回该语句,否则进入st印3 ;st印3 删除基础SQL语句后分号,加空格,复制从基础SQL语句连接关键字开始至语句末尾的SQL语句并添加到空格后,N-I ;st印4:如果N= 1,添加分号,返回SQL ;如果不是,返回st印3 ;(f)对于多表交、并、差集查询,执行下面流程生成SQL语句,加入SQLList,关键字列表减去生成语句中包含的SQL语句,执行步骤(i);stepl 计算连接关键字个数N,取得自定义基础SQL (1);st印2 添加交,并,差关键字,N-I ;st印3 添加自定义基础SQL (1);st印4 如果N = 0,添加分号,返回SQL ;如果不是,返回st印2 ;(g)对于子查询的SQL语句,继续如下步骤,生成SQL语句加入SQLList,关键字列表减去生成语句中包含的SQL语句,执行步骤(i);st印1 计算子查询级数N,取得自定义基础SQL (10);st印2 查找第一个id = 1的位置,删除1,添加“ 0 ”,将(2)插入括号内,N-I ;st印3 如果N = O,返回SQL ;如果不是,返回st印2。(h)如果关键字不在基础SQL语句中包含,从Postgres测试集合中挑选匹配的 SQL语句加入SQLList,执行步骤(i);(i)如果KeyWordsList为空,过程结束,返回SQLList ;否则继续处理下一个分组。本发明的有益效果是由于以Postgres数据库测试集为基础,通过对SQL关键字分类、组合、设计基础SQL语句和生成方法,来根据用户指定的关键字自动生成复杂的SQL 语句,可以生成根据组合关键字的复杂SQL语句。这些语句可以直接应用于数据库系统的测试过程,解决手工编写组合关键字的SQL语句出错率高,效率低的问题。下面结合具体实施方式
对本发明作详细说明。
具体实施例方式假设指定如下的SQL 关键字为{select,join, join, group by, where, intersect},需要生成SQL语句,则生成方法如下A.构建基础SQL语句如下select*from tl ; (1)
select id from tl where id = 1 ; (2)select distinct id,name from tl where id > = lorder by id ; (3)select count (id), sum (id),avg (id),max (id),min (id) from tl group by name havingcount (id) > Oorder by id ; (4)select*from tl, t2 ; (5)select氺from tl natural join t2 on tl. id = t2. id ; (6)select^from tl join t2 using(id) ; (7)select水from tl left outer join t2 using(id) ; (8)select水from tl right outer join t2 using(id) ; (9)select*from tl where id = (select id from tl where id = 1) ; (10)B.根据输入SQL组合关键字构建SQL关键字列表KeyWordsList和SQL语句列表 SQLList,关键字列表的初值为用户输入的所有关键字,SQL语句列表初值为空。KeyffordsList = {select, join, join, group by, where, intersect},SQLList = {};C.对关键字分组单表={select,group by, where},多表连接={join, join},多表交集= {intersect}D.对于单表查询,根据输入关键字从基础SQL语句(1) (4)中查找包含特定关键字的语句加入SQLList,关键字列表减去生成语句中包含的SQL语句,执行步骤(i);按照关键字包含最多的SQL优先选择的原则,从基础SQL语句(1) (4)查到(2)包含{select, where},(4)包含{group by},将这两条SQL语句加入SQLList,关键字列表减去这三个, 则KeyWordsList = {join,join,intersect},SQLList = {select id from tl where id = 1 ;select count (id),sum (id),avg (id),max (id),min (id) from tl group by name having count (id) > Oorder by id;};Ε.对于多表查询,继续判断是否连接查询,如果是,执行下面流程生成SQL语句, 加入SQLList,关键字列表减去生成语句中包含的SQL语句,执行步骤(i);stepl 计算连接关键字个数N,根据输入关键字从自定义基础SQL语句(5) (9) 中选择包含指定关键字的SQL语句;st印2 如果是N = 1,直接返回该语句,否则进入st印3 ;st印3 删除基础SQL语句后分号,加空格,复制从基础SQL语句连接关键字开始至语句末尾的SQL语句并添加到空格后,N-I ;select氺from tl natural join t2 on tl. id = t2. id join t2 on tl. id = t2. id ;将上述语句加入SQLList,关键字列表减去两个join关键字,则
权利要求
1. 一种复杂SQL语句的生成方法,其特征在于釆用以下步骤(a)构建基础SQL语句 select水from tl ; (1)select id from tl where id = 1 ; (2)select distinct id,name from tl where id > = lorder by id ; (3) select count (id),sum (id), avg(id),max (id), min (id) from tl group by name having count (id) > Oorder by id ; (4) select^from tl, t2 ; (5)select氺from tl natural join t2 on tl. id = t2. id ; (6)select^from tl join t2 using(id) ; (7)select水from tl left outer join t2 using(id) ; (8)select水from tl right outer join t2 using(id) ; (9)select*from tl where id = (select id from tl where id = 1) ; (10)(b)构建SQL关键字列表KeyWordsList和SQL语句列表SQLList KeyWordsList = {用户指定的组合SQL关键字},SQLList = {};(c)关键字分组,关键字按照匹配原则归属于四个组单表查询={with, select,distinct,as,from, where,group by, having, order by, limit,offset,sum,count,min, max, avg};多表连接查询={natural,join,on,using}; 多表交、并、差集查询={intersect,union,except, };子查询={select,from, where, select};(d)对于单表查询,根据输入关键字从基础SQL语句⑴ (4)中查找包含特定关键字的语句加入SQLList,关键字列表减去生成语句中包含的SQL语句,执行步骤(i);(e)对于多表连接查询,执行下面流程生成SQL语句,加入SQLList,关键字列表减去生成语句中包含的SQL语句,执行步骤(i);stepl 计算连接关键字个数N,根据输入关键字从自定义基础SQL语句(5) (9)中选择包含指定关键字的SQL语句;st印2 如果是N = 1,直接返回该语句,否则进入st印3 ; st印3:删除基础SQL语句后分号,加空格,复制从基础SQL语句连接关键字开始至语句末尾的SQL语句并添加到空格后,N-I ;st印4 如果N = 1,添加分号,返回SQL ;如果不是,返回st印3 ;(f)对于多表交、并、差集查询,执行下面流程生成SQL语句,加入SQLList,关键字列表减去生成语句中包含的SQL语句,执行步骤(i);stepl 计算连接关键字个数N,取得自定义基础SQL(I); st印2 添加交,并,差关键字,N-I ; st印3 添加自定义基础SQL(I);st印4 如果N = 0,添加分号,返回SQL ;如果不是,返回step2 ;(g)对于子查询的SQL语句,继续如下步骤,生成SQL语句加入SQLList,关键字列表减去生成语句中包含的SQL语句,执行步骤(i);stepl 计算子查询级数N,取得自定义 基础SQL (10);st印2 查找第一个id = 1的位置,删除1,添加“ 0 ”,将(2)插入括号内,N-I ; st印3 如果N = 0,返回SQL ;如果不是,返回st印2 ;(h)如果关键字不在基础SQL语句中包含,从Postgres测试集合中挑选匹配的SQL语句加入SQLList,执行步骤⑴;(i)如果KeyWordsList为空,过程结束,返回SQLList;否则继续处理下一个分组。
全文摘要
本发明公开了一种复杂SQL语句的生成方法,用于解决现有的SQL语句的生成方法不能生成根据组合关键字的复杂SQL语句的技术问题。技术方案是以Postgres数据库测试集为基础,通过对SQL关键字分类、组合、设计基础SQL语句和生成方法,来根据用户指定的关键字自动生成复杂的SQL语句,可以生成根据组合关键字的复杂SQL语句。这些语句可以直接应用于数据库系统的测试过程,解决手工编写组合关键字的SQL语句出错率高,效率低的问题。
文档编号G06F17/30GK102222097SQ201110163280
公开日2011年10月19日 申请日期2011年6月16日 优先权日2011年6月16日
发明者刘文洁, 周云涛, 张晓 , 李战怀 申请人:西北工业大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1