往往我们有需求对多个结果集的数据通过一定规则整合成另外一个结果集。我们来看一个案例:
假定我们有结果集A:
学号姓名
01 张三
02 李四
03 王五
04 赵六
05 钱七
结果集B:
学号英语成绩
01 80
02 60
04 90
03 50
05 88
我们现在要合成一个同时具备学号,姓名,英语成绩的结果集,这类需求我们在SQL中称之为多表联接,通过join关键字来支持:
R:=select [1].*,[2].["英语成绩"] from A join B on [1].["学号"]=[2].["学号"] end;
R的结果就是我们要的结果集,我们来理解下多表查询和单表查询的差异:
首先是访问字段的表达方式有变化:我们以[2].["英语成绩"]来访问B的英语成绩列,用[1].["学号"]来表示了A结果集的学号,[2].["学号"]来表示B结果集的学号,而[1].*则表示了A结果集的所有字段。这个规则是什么呢?当存在有多表的时候,我们采用[TableOrder].[TableField]的模式来访问表的字段,而TableOrder则是表(结果集)在select中出现的次序(该次序从1开始),如果要返回某个表所有的字段,则采用[TableOrder].*的模式。
注意:如果没有字段重名的问题,*可以表达所有字段,而["英语成绩"]也可以自动选择到包含有英语成绩的表(结果集),如果有字段重复,我们建议带[TableOrder].前缀指定表。
其次是from字句里引入了join和on关键字,A join B,表示B和A进行联接,而表与表之间进行联接的时候,必需具有联接的条件,这个条件在on关键字之后,上边的范例中on [1].["学号"]=[2].["学号"]就是联接的条件。由于select是基于行的,所以join是基于行的联接,而on则是行联接的条件。范例的含义为:将A表中的学号和B中的学号相同的行联接起来,并返回A中所有列以及B中的英语成绩列。