需求:一张表由多张表的多个字段组成,其中关联关系是外连接(内连接比较容易),其中有N张表,M个字段。
主表是一张表
使用到的中间变量:
- 保存所有关联表的表名的数组 var winIdList= [];
- 关联过的表名数组 var winIdUsed= [];
- 保存源表name,源表字段name,目标表name,目标表字段name的对象的数组 var columns =[];
- 关联条件(ON前表名及字段,ON后表名及字段)集合var conditions =[],关联过的条件所对应的关联条件集合的下标的集合
var usedIndex =[];
- 先确认主表A
一般默认是winIdList[0]。 - 拼接SELECT与FROM之间字段组成的字符串var str1 =”“;
循环columns ,获取目标表的字段name,用“,”拼接,截取str1=str1.substr(0,str1.length-1); - 拼接关联关系LEFT JOIN ON 内容
关键点:
表名winIdList无序;
关联条件conditions无序;
ON前后对应的一对表名出现多次(JOIN ……ON……[AND……[AND……[……]]]);
在关联条件conditions出现的表名的顺序不定(表名在ON前或后,与表名winIdList出现的顺序不一致)。
解决办法(除去主表,循环执行)
a.在拼接ON条件时,先检查所有的关联条件conditions(循环),(ON前后表名)是否存在主表A,有一(前或后)存在时,检查另一是否为A;不为A则符合要求(否则抛出关联关系错误),记录为B;确保关联条件关联到所有的表(表名通过字段相互关联)。
b.根据a检查的结果,判断是否进行b。重新进行a,在检查时,确定表B,var str2 =”LEFT JOIN B”,把表A,B添加进winIdUsed;把此条关联关系的下标 I 保存进usedIndex;str2 +=”ON”+”ON前表名的字段名” +”=”+”ON后表名的字段名”;
c.以A,B为一对表(不分前后),查询关联条件conditions(除去usedIndex里的下标)的关联条件(JOIN一张表,把所有的主表A和关联表B的关联条件都选择出来),拼接ON后的AND语句。
d.循环关联条件(下标不在usedIndex),先确定该条关联条件的一张表关联过(在关联过的表名winIdUsed中),重复b.c.操作。
e.检查关联过的下标的数组usedIndex的长度与所有关联条件的集合的大小是否相等,不等的所有的条件,用“AND”连接在最后(这部分是自连接条件)。
f.所需要的SQL语句就是 “SELECT ” +str1 +” FROM “+str2;(注意拼接时空格)
- 先确认主表A
主表是其中一张表的查询结果
类似上述内容,先确定出主表SQL语句,起别名。