• 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');

    三、总结

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



  • 相关阅读:
    dom4j解析带命名空间的xml文件
    Spring使用facotry-method创建单例Bean总结<转>
    代码审查工具StyleCop
    ReSharper 配置及用法(二)
    ReSharper 配置及用法(一)
    linqPad快速学习LINQ(含视频)
    评估期已过。有关如何升级的测试版软件的信息
    SQL批量更新数据库中所有用户数据表中字段类型为tinyint为int
    SQL SERVER获取数据库中所有表名 XTYPE类型
    sqlserver中创建链接服务器
  • 原文地址:https://www.cnblogs.com/PengLuo22/p/13514077.html
Copyright © 2020-2023  润新知