TSL语言基础 > SQL基础到TS-SQL > TS-SQL入门 > select查询语句 > join处理多表联接查询 > Left Join,Right Join,Full Join

Left Join    

  •   Join产生的结果集可以理解为笛卡尔积中符合条件的行的集合,在实际应用中,我们经常会遇到Join无法解决的联接问题。
    假定上边的案例中的结果集C包括的不是语文成绩,而是俄语成绩。而A结果集中所包括的学号包括所有学生,而这些学生有的选择的外语是英语,有的选择的是俄语,而我们现在需要汇总一份成绩表。由于B结果集和C结果集中的学号都不完整,如果使用R:=select [1].*,[2].["英语成绩"] from A join B on [1].["学号"]=[2].["学号"] end;则R结果集中将不会包括没有英语成绩的学号,而采用R:=select [1].*,[2].["英语成绩"],[3].["俄语成绩"] from A join B on [1].["学号"]=[2].["学号"] join C on [1].["学号"]=[3].["学号"] end;则 R的结果会是一个空集,因为有俄语成绩的人没有英语成绩,有英语成绩的人没有俄语成绩。这可能和我们预期的结果是不一致的,我们或许需要的结果集是这样的:包括所有学生,没有俄语成绩的俄语成绩保留为空,没有英语成绩的英语成绩保留为空。
    如何解决这个问题呢?我们来看一段修正后的代码:
    R:=select [1].*,[2].["英语成绩"],[3].["俄语成绩"] from A Left join B on [1].["学号"]=[2].["学号"] Left join C on [1].["学号"]=[3].["学号"] end;
    在这里,我们采用了Left Join替换了Join。什么是Left Join呢?与Join不同的是,Left Join是以左结果集为基准,如果右结果集缺乏满足和左结果集中的某行联接的条件的行,那么依旧保留一条左结果集中的行,而联接的右结果集假定为空(所有字段的值为NIL)。
      LEFT JOIN的结果显然吻合我们的预期,这样的结果集中包括所有A结果集中的学生,而没有成绩的学生保留为空。