前端表关联SQL拼接实现

来源:互联网 发布:m audio声卡驱动mac 编辑:程序博客网 时间:2024/05/22 06:31

需求:一张表由多张表的多个字段组成,其中关联关系是外连接(内连接比较容易),其中有N张表,M个字段。

主表是一张表

使用到的中间变量:

  1. 保存所有关联表的表名的数组 var winIdList= [];
  2. 关联过的表名数组 var winIdUsed= [];
  3. 保存源表name,源表字段name,目标表name,目标表字段name的对象的数组 var columns =[];
  4. 关联条件(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;(注意拼接时空格

主表是其中一张表的查询结果

类似上述内容,先确定出主表SQL语句,起别名。

0 0
原创粉丝点击