MySQL中的自联结使用场合

一、概念

自联结是MySQL中描述表关系的一种方式,它是自己join自己的一种形式,常用于结果(中间数据)与条件在同一表中的情形。

二、实例

【案例1】抽查中发现产品prod_id='DTNTR'的产品质量有问题,于是举一反三查询该供应商vend_id供的其他产品是否合格,请筛选出该供应商提供的所有商品

【分析】解法用的方法是采用p1 join p2,用到的是自联结,p1、p2这两张表都是products的别名

【步骤】

1 select p1.vend_id,p1.prod_id,p1.prod_name
2 from products as p1
3 join products as p2 on p1.vend_id=p2.vend_id
4 where p2.prod_id='DTNTR';

【案例2】查询和" 01 "号的同学学习的课程 完全相同的其他同学的信息

【分析】因为要查的结果是SId,SId的需要满足的条件:学的课和01学的完全一致,和条件都在存储课程的表sc中,所以采用自联结。

【步骤1】首先先找必要条件:其它同学和01学的单门课程一致的所有情况

1 --笛卡尔积中筛选出其它同学和01学的单门课程一致的所有情况
2 select s1.*,s2.*
3 from sc as s1
4 join sc as s2
5 on s1.cid=s2.cid and s1.sid='01' and s2.sid!='01'

【步骤2】再添加其他同学学的课程数等于01的课程数,作为充要条件

1 select s2.sid,count(s2.cid)
2 from sc as s1
3 join sc as s2
4 on s1.cid=s2.cid and s1.sid='01' and s2.sid!='01'
5 group by  s2.sid
6 having count(s2.cid) = (select count(*) from sc where sid='01');

 

【步骤3】再join student表补全其它信息:

1 --join student表
2 select s2.sid,student.Sname,count(s2.cid),count(s1.cid)
3 from sc as s1
4 join sc as s2
5 on s1.cid=s2.cid and s1.sid='01' and s2.sid!='01'
6 join student on s2.sid = student.sid
7 group by s2.sid,student.Sname
8 having count(s2.cid) = (select count(*) from sc where sid='01');

三、总结

自联结的适用场合是结果和条件都在同一张表中,我们就可以自联结这张表



posted @ 2020-08-16 20:40  米罗{mirror}  阅读(242)  评论(0编辑  收藏  举报