FAQ > 金融建模 > 建模问题 > 语法相关

Q:天软表连接的应用(join)    

简述
JOIN用于对多表进行连接,可以是JOIN,LEFT JOIN,RIGHT JOIN,FULL JOIN,CROSS JOIN。JOIN,LEFT JOIN,RIGHT JOIN,FULL JOIN支持ON或者WITH条件约束。

  • A:天软表连接的方法以下几种方式:
    连接类型固定搭配生成新表连接索引集合
    joinon|with on有条件连接,仅返回满足匹配条件的记录索引交集
    Full Joinon|with on有条件连接,返回所有连接的记录(包括两表匹配不成功的)索引并集
    Left Joinon|with on有条件连接,返回左表所有行连接的记录(包括左表匹配不成功的)左表索引
    Right Joinon|with on有条件连接,返回右表所有行连接的记录(包括右表匹配不成功的)右表索引
    cross Join无条件连接,生成笛卡尔积无索引(任意两两搭配)

    共性要点:
    1、表连接方式是SQL语法中的功能,需要搭配select语法进行使用
    2、所有连接方式都支持where条件进行筛选
    3、支持多表连接,即可进行两表及两个以上表的操作,多表连接可参考:FAQ:Q:如何实现多表连接
    4、表连接中对表对象用[1].['字段']这样子的方式进行描述,按join顺序,在最前面的是第1个表,下一个即第2个表,依此类推
    特别地:
    1、cross Join 不能与on或with on进行搭配使用,可用where条件筛选
    2、with on是对on条件的一个效率优化,支持多条件描述(用,分隔),但不支持超大数据结果集的运算,而on支持。
    3、当表进行连接时,返回的字段中存在同名字段时,后面字段会覆盖前面相同字段的值。

    文字描述总是不够具体的,下面依次描述并举例各种类型的功能及用法,
    用户可根据实现代码,返回的结果,及实例的解析进行对比理解。
    其中,实例中都用Table1与Table2的两个表格数据作为连接对象:

    表格代码:
    Table1:=array(('A':1,'B':2,'C':7),
      ('A':10,'B':3,'C':12),
      ('A':10,'B':20,'C':12),
      ('A':4,'B':20,'C':34),
      ('A':4,'B':10,'C':4));

    Table2:=Array(('A':10,'B':10,'D':3),
      ('A':15,'B':20,'D':3),
      ('A':4,'B':10,'D':3),
      ('A':5,'B':10,'D':3));

    表格数据展示:
    Table1:
    ABC
    127
    10312
    102012
    42034
    4104

    Table2:
    ABD
    10103
    15203
    4103
    5103

    join用法:
    实例:
    return select [1].*,[2].['A'] as 'A2',[2].['B'] as 'B2',[2].['D']
         from Table1 join Table2 on [1].['A']=[2].['A'] end;

    返回:
    ABCA2B2D
    1031210103
    10201210103
    420344103
    41044103

    解析:将两表通过字段"A"进行连接,将连接成功的记录进行返回。
    可以看出,结果集中只存在两表中连接成功的记录,即"A"列值相同的行。
    技巧解析:
    1、由于两表中存在相同的字段名称,而同一表中列名不可以相同,所以,既要显示Table1中列A、B的值,又要正常显示Table2中列A、B的值时,可以对Table2中同名的字段进行重命名后返回

    2、将上面的on方式改成with on 方式,我们可以变更为:
    t:= select [1].*,[2].['A'] as 'A2',[2].['B'] as 'B2',[2].['D']
     from Table1 join Table2 with([1].['A'] on [2].['A']) end;

    3、若想要将连接的索引条件变更为"A"列与"B"都相同时:
    on方式:可借助where条件进行二次筛选,也可拼关键词进行一次性筛选
    where筛选
    t:= select [1].*,[2].['A'] as 'A2',[2].['B'] as 'B2',[2].['D']
     from Table1 join Table2 on [1].['A']=[2].['A'] where [1].['B']=[2].['B'] end;

    拼关键词方法
    t:= select [1].*,[2].['A'] as 'A2',[2].['B'] as 'B2',[2].['D']
     from Table1 join Table2 on [1].['A']$[1].['B']=[2].['A']$[2].['B'] end;

    with on方式:
    return select [1].*,[2].['A'] as 'A2',[2].['B'] as 'B2',[2].['D']
     from Table1 join Table2 with([1].['A'],[1].['B'] on [2].['A'],[2].['B']) end;

    返回结果:
    ABCA2B2D
    41044103


    Full Join
    实例1:
    return select [1].*,[2].['A'] as 'A2',[2].['B'] as 'B2',[2].['D']
      from Table1 Full join Table2 on [1].['A']=[2].['A'] end;

    返回:
    ABCA2B2D
    127
    1031210103
    10201210103
    420344103
    41044103
    15203
    5103

    解析:将两表通过字段"A"进行连接,返回所有连接记录,条件不匹配的用nil补充。
    可以看出,结果集中两表的记录都存在,只将满足条件的行进行连接。
    其它with on或多字段的连接可参考Join的技巧解析,用法与功能一样。

    实例2:Full Jion中索引列显示并集
    若想将索引列显示并集内容,且只在同一列中保存,则可通过判断方式生成该列内容,如下:
    return select [1].*,[2].['B'] as 'B2',[2].['D'],
      ifnil([1].['A'])?[2].['A']:[1].['A'] as 'A'
      from Table1 Full join Table2 on [1].['A']=[2].['A'] end;

    结果:
    ABCB2D
    127
    10312103
    102012103
    42034103
    4104103
    15203
    5103

    解析:其中的A列,取连接后两表中存在的数值的内容中去填值,即生成两表中A列表并集,解决未连接到的行存在空值的问题。

    Left join
    实例:
    return select [1].*,[2].['A'] as 'A2',[2].['B'] as 'B2',[2].['D']
     from Table1 left join Table2 on [1].['A']=[2].['A'] end;

    返回:
    ABCA2B2D
    127
    1031210103
    10201210103
    420344103
    41044103

    解析:将两表通过字段"A"进行连接,返回左表所有连接记录,条件不匹配的用nil补充。
    可以看出,结果集中左表Table1的记录都存在,而右表Table2表中不匹配的记录不存在。
    其它with on或多字段的连接可参考Join的技巧解析,用法与功能一样。

    Right join
    实例:
    return select [1].*,[2].['A'] as 'A2',[2].['B'] as 'B2',[2].['D']
      from Table1 Right join Table2 on [1].['A']=[2].['A'] end;

    返回:
    ABCA2B2D
    1031210103
    10201210103
    15203
    420344103
    41044103
    5103

    解析:将两表通过字段"A"进行连接,返回右表所有连接记录,条件不匹配的用nil补充。
    可以看出,结果集中右表Table2的记录都存在,而左表Table1表中不匹配的记录不存在。
    其它with on或多字段的连接可参考Join的技巧解析,用法与功能一样。

    cross Join
    实例:
    t:= select [1].*,[2].['A'] as 'A2',[2].['B'] as 'B2',[2].['D']
     from Table1 cross join Table2 end;

    返回(只返回前10行进行展示):
    ABCA2B2D
    12710103
    12715203
    1274103
    1275103
    1031210103
    1031215203
    103124103
    103125103
    10201210103
    10201215203
    ...

    解析:两个表格的行与行的笛卡尔积连接组合,5*4=20条记录