• 3.8 识别和消除笛卡尔积


    问题:
    要返回在部门10中每个员工的姓名,以及部门的工作地点,下面的查询达到的是错误数据:

    select e.ename,d.loc
        from emp e ,dept d
    where e.deptno =10

    解决方案:在from子句对表进行连接来返回正确的结果集:

    select e.ename,d.loc
        from emp e,dept d
        where e.deptno =10
            and d.deptno = e.emptno


    讨论:
    看表dept中的数据,可以看出,部门10的工作地点是在New York,所以,在返回值中部门所在地点除了New york以外的任何值都是错误的。错误查询得到的行数是from子句后面两个表基数的积。在原查询中,对表emp的筛选条件是部门为10,结果有3行,因为没有对表dept进行筛选,表dept的所有四行全部返回,3乘以4得12,所以这个错误查询就返回了12行。一般来说,要避免产生笛卡尔积,需要使用n-1规则,这里的n为from子句中表的数量,并且n-1是要避免产生笛卡尔积的最小连接数。根据在表中的关键字和链接列不同,可能需要超过n-1个连接,但是对党写查询来说,n-1是一个好的开始。

    注意:如果笛卡尔积应用适当也很有用。很多查询都用到了笛卡尔积,常用的场合有转置(反向转置)结果集,产生顺序值和模拟循环等

  • 相关阅读:
    Centos安装JIRA 7.13版本(自己在官方下载最新版)以及破解
    5. iphone 的:active样式
    4. css事件
    3. css百度制作字体图片
    8. react 常用组件
    3. JS生成32位随机数
    JS大小转化B KB MB GB的转化方法
    7.关于一些dom&&获取元素
    加密问题
    2.hover的使用
  • 原文地址:https://www.cnblogs.com/l10n/p/7518473.html
Copyright © 2020-2023  润新知