美文网首页
19、左连接面试题讲解

19、左连接面试题讲解

作者: 小碧小琳 | 来源:发表于2018-12-13 22:03 被阅读0次

    一、面试题

    1.1、表结构

    有两个表,一个是赛程表,出于节省空间考虑,并没有把主队与客队的名称写进去,包含以下字段:

    另外有一张专门的参赛队伍表:

    由team_ID 与 team_name两个字段组成。(类似于前面左连接例子中的商品表与商品名称两个表)

    1.2、构造表并插入数据

    用sql构建这两张表,这里偷懒就不为每个字段赋默认值了。
    其中字母m代表match表示比赛,字母t代表team表示队伍,注意不能用match单词作为表名,因为“match”是sql中的关键字。

    赛程表 team表

    1.3、题目:

    已知有两个如上的表,现在要求取出6月1号到7月1号之间的比赛的结果,并且队伍id应显示出队名才行。也就是,最终结果样例应该如下:

    二、题目思路:

    根据题意,“队伍id显示出队名”,想到一定会用左连接来做。但是有h_id与g_id两个字段,一个左连接是做不出来的。具体应该怎么做呢?

    由简入繁,由浅入深,解决问题的王道

    2.1、第一步:调整字段的顺序,向最后的结果靠齐。

    调整顺序

    2.2、第二步:再前进一小步,根据h_id,左连team表,查出主队的队伍名称(即简单的2张表左连接)

    h_id表

    其中t_name就是从team表中左连接以后,得到的。

    2.3、第三步:同理于上面,根据g_id得到客队的队伍名称。

    想要得到g_id,我们就把h_id表看成结果,然后和team表,再一次左连即可。

    也就是说我们可以把 m left join on m.h_id = t.t_id 这个语句当做一个表名来看。于是,再次左联一次,得到如下语句:

    但还是出错了。注意看,在第一个左联中,有m,t两个表,第二个左联表中,还有一个t表。表名不唯一,导致的错误。

    解决方法:起个别名就可以解决,select 列名 as 别名,那么也就可以 from 表名 as 表别名。
    比如,在下面from中,让第一个t变成t1。重新执行h_id的语句

    发现结果跟(h_id表)中结果是一样的。

    同样,我们也可以让第二天t变成t2,注意,后面调用该t表名时,都要改成t2才行,在t_name也有重复情况,前面需要加上表名加以区分。

    2.4、快要成功了

    我们把多余的列去掉即可,如下:

    2.5、最后一步

    题目要求取出6月1号到7月一号之间的。于是想到表查询的的where子句。

    前面说过,左连接之后,得到的是一张表,那么where,group,等五个子句也是照常使用的。

    因此加一个where筛选条件即可。
    这里我们认为“之间”代表包括边界值,那么就用between and 即可。

    得到最终结果。

    一个简单的三表联查的题目。

    相关文章

      网友评论

          本文标题:19、左连接面试题讲解

          本文链接:https://www.haomeiwen.com/subject/tshmhqtx.html