A:
天软表连接的方法以下几种方式:
连接类型 | 固定搭配 | 生成新表 | 连接索引集合
|
---|
join | on|with on | 有条件连接,仅返回满足匹配条件的记录 | 索引交集
|
Full Join | on|with on | 有条件连接,返回所有连接的记录(包括两表匹配不成功的) | 索引并集
|
Left Join | on|with on | 有条件连接,返回左表所有行连接的记录(包括左表匹配不成功的) | 左表索引
|
Right Join | on|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:
A | B | C
|
---|
1 | 2 | 7
|
10 | 3 | 12
|
10 | 20 | 12
|
4 | 20 | 34
|
4 | 10 | 4
|
Table2:
A | B | D
|
---|
10 | 10 | 3
|
15 | 20 | 3
|
4 | 10 | 3
|
5 | 10 | 3
|
join用法:
实例:
return select [1].*,[2].['A'] as 'A2',[2].['B'] as 'B2',[2].['D']
from Table1 join Table2 on [1].['A']=[2].['A'] end;
返回:
A | B | C | A2 | B2 | D
|
---|
10 | 3 | 12 | 10 | 10 | 3
|
10 | 20 | 12 | 10 | 10 | 3
|
4 | 20 | 34 | 4 | 10 | 3
|
4 | 10 | 4 | 4 | 10 | 3
|
解析:将两表通过字段"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;
返回结果:
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;
返回:
A | B | C | A2 | B2 | D
|
---|
1 | 2 | 7 | | |
|
10 | 3 | 12 | 10 | 10 | 3
|
10 | 20 | 12 | 10 | 10 | 3
|
4 | 20 | 34 | 4 | 10 | 3
|
4 | 10 | 4 | 4 | 10 | 3
|
| | | 15 | 20 | 3
|
| | | 5 | 10 | 3
|
解析:将两表通过字段"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;
结果:
A | B | C | B2 | D
|
---|
1 | 2 | 7 | |
|
10 | 3 | 12 | 10 | 3
|
10 | 20 | 12 | 10 | 3
|
4 | 20 | 34 | 10 | 3
|
4 | 10 | 4 | 10 | 3
|
15 | | | 20 | 3
|
5 | | | 10 | 3
|
解析:其中的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;
返回:
A | B | C | A2 | B2 | D
|
---|
1 | 2 | 7 | | |
|
10 | 3 | 12 | 10 | 10 | 3
|
10 | 20 | 12 | 10 | 10 | 3
|
4 | 20 | 34 | 4 | 10 | 3
|
4 | 10 | 4 | 4 | 10 | 3
|
解析:将两表通过字段"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;
返回:
A | B | C | A2 | B2 | D
|
---|
10 | 3 | 12 | 10 | 10 | 3
|
10 | 20 | 12 | 10 | 10 | 3
|
| | | 15 | 20 | 3
|
4 | 20 | 34 | 4 | 10 | 3
|
4 | 10 | 4 | 4 | 10 | 3
|
| | | 5 | 10 | 3
|
解析:将两表通过字段"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行进行展示):
A | B | C | A2 | B2 | D
|
---|
1 | 2 | 7 | 10 | 10 | 3
|
1 | 2 | 7 | 15 | 20 | 3
|
1 | 2 | 7 | 4 | 10 | 3
|
1 | 2 | 7 | 5 | 10 | 3
|
10 | 3 | 12 | 10 | 10 | 3
|
10 | 3 | 12 | 15 | 20 | 3
|
10 | 3 | 12 | 4 | 10 | 3
|
10 | 3 | 12 | 5 | 10 | 3
|
10 | 20 | 12 | 10 | 10 | 3
|
10 | 20 | 12 | 15 | 20 | 3
|
... | | | | |
|
解析:两个表格的行与行的笛卡尔积连接组合,5*4=20条记录