zoukankan      html  css  js  c++  java
  • 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是一个好的开始。

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

  • 相关阅读:
    POJ
    归并排序+归并排序求逆序对(例题P1908)
    HDU
    2018-12-5 及 codeforces round 525v2
    2018-12-1学习纪录
    近期总结和未来规划
    C++ storage allocation + Dynamic memory allocation + setting limits + initializer list (1)
    注意项
    第四课 计算机的基本组成
    第二课+第三课 计算机系统概论
  • 原文地址:https://www.cnblogs.com/liang545621/p/7518473.html
Copyright © 2011-2022 走看看