sql语句中出现笛卡尔乘积

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-01 21:12 点击:

没有join条件导致笛卡尔乘积
      学过线性代数的人都知道,笛卡尔乘积通俗的说,就是两个集合中的每一个成员,都与对方集合中的任意一个成员有关联。可以想象,在SQL查询中,如果对两张表join查询而没有join条件时,就会产生笛卡尔乘积。这就是我们的笛卡尔乘积导致的性能问题中最常见的案例:开发人员在写代码时遗漏了join条件。

 

发生笛卡尔乘积的sql:

view plaincopy to clipboardprint?select sum(project_fj.danjia*project_fj.mianji) from project_fj,orderform where project_fj.zhuangtai='未售' and project_fj.project_id=30  
select sum(project_fj.danjia*project_fj.mianji) from project_fj,orderform where project_fj.zhuangtai='未售' and project_fj.project_id=30

 

 

这个语句其实只是sql语句的一部分,问题是另一部分用到了表orderform,所以from中有orderform,但是上面的这部分语句完全没有用到orderform,但是不设置条件就导致了笛卡尔乘积。

 

解决方法:使用LEFT JOIN

view plaincopy to clipboardprint?select sum(project_fj.danjia*project_fj.mianji) from project_fj LEFT JOIN orderform ON project_fj.id=orderform.project_id 
 where project_fj.zhuangtai='未售' and project_fj.project_id=30  
select sum(project_fj.danjia*project_fj.mianji) from project_fj LEFT JOIN orderform ON project_fj.id=orderform.project_id
 where project_fj.zhuangtai='未售' and project_fj.project_id=30

 

本文出自“suixufeng的专栏”

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • sql常见面试题
    • SQL SERVER 2005性能之跟踪
    • SQL编程(一)
    • LINUX上RMAN自动备份脚本
    • sql server面试题
    • 如何将多个SQL查询统计结果一次显示出来
    • 浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色
    • sql server 列转行
    • SQL小技巧系列 --- 行转列合并
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1