码迷,mamicode.com
首页 > 其他好文 > 详细

3.08 识别和消除笛卡尔积

时间:2017-09-14 10:41:08      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:关键字   不同   连接数   name   循环   并且   工作   返回   应用   

问题:
要返回在部门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是一个好的开始。

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

3.08 识别和消除笛卡尔积

标签:关键字   不同   连接数   name   循环   并且   工作   返回   应用   

原文地址:http://www.cnblogs.com/liang545621/p/7518473.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!