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是一个好的开始。

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

  • 相关阅读:
    js原始数据类型和引用数据类型=>callback数据传输原理
    wamp虚拟服务器
    chrome 跨域设置-(完善博客内容)
    js原生API----查找dom
    正则表达式
    ajax ----进度条的原理
    ajax 原理----初级篇
    转载 webstrom识别 React语法
    javascript性能优化
    JavaScript DOM
  • 原文地址:https://www.cnblogs.com/liang545621/p/7518473.html
Copyright © 2011-2022 走看看