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

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

  • 相关阅读:
    【1】Chrome
    Vue
    GitHub版本控制工具入门(一)
    Vue.js 组件笔记
    最全的javascriptt选择题整理
    网站如何实现 在qq中发自己链接时,便自动获取链接标题、图片和部分内容
    js 唤起APP
    密码加密MD5,Bash64
    HTTP和HTTPS的区别及HTTPS加密算法
    计算机网络七层的理解
  • 原文地址:https://www.cnblogs.com/liang545621/p/7518473.html
Copyright © 2011-2022 走看看