sql语句中出现笛卡尔乘积

没有join条件导致笛卡尔乘积

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

发生笛卡尔乘积的sql:

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

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 
时间: 2024-11-10 17:57:49

sql语句中出现笛卡尔乘积的相关文章

[转]sql语句中出现笛卡尔乘积 SQL查询入门篇

本篇文章中,主要说明SQL中的各种连接以及使用范围,以及更进一步的解释关系代数法和关系演算法对在同一条查询的不同思路. 多表连接简介 在关系数据库中,一个查询往往会涉及多个表,因为很少有数据库只有一个表,而如果大多查询只涉及到一个表的,那么那个表也往往低于第三范式,存在大量冗余和异常. 因此,连接(Join)就是一种把多个表连接成一个表的重要手段. 比如简单两个表连接学生表(Student)和班级(Class)表,如图: 进行连接后如图: 笛卡尔积 笛卡尔积在SQL中的实现方式既是交叉连接(Cr

ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积01, 在控制台实现

在电商产品模块中必经的一个环节是:当选择某一个产品类别,动态生成该类别下的所有属性和属性项,这些属性项有些是以DropDownList的形式存在,有些是以CheckBoxList的形式存在.接着,把CheckBoxList的选中项组合生成产品SKU项. 本系列将在ASP.NET MVC中实现以上功能.但本篇,先在控制台实现属性值的笛卡尔乘积. 关于属性的类: public class Prop { public int Id { get; set; } public string Name {

ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积02, 在界面实现

在"ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积01, 在控制台实现"中,在控制台应用程序中实现了属性值的笛卡尔乘积.本篇在界面中实现.需要实现的大致如下: 在界面中勾选CheckBoxList中属性值选项: 把勾选的属性值进行笛卡尔乘积,每行需要填写价格: 我们暂且不考虑这些CheckBoxList是如何显示出来的(在后续有关商品模块的文章中会实现),还需考虑的方面包括: 1.从CheckBoxList中获取到什么再往控制器传? 对于每行的CheckBoxList来说

回顾sql语句中的各种连接

1. 内连接(Inner Join) 内连接是最常见的一种连接,它页被称为普通连接,而E.FCodd最早称之为自然连接. 下面是ANSI SQL-92标准 select * from    t_institution i inner join t_teller t on i.inst_no = t.inst_no where i.inst_no = "5801" 其中inner可以省略. 等价于早期的连接语法 select * from t_institution i, t_telle

albert1017 SQL语句中的JOIN语句

要理解join语句,首先得明白笛卡尔乘积(即集合的乘运算),其定义如下: 笛卡尔(Descartes)乘积又叫直积.假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}. 在SQL的join联结操作中,其实也是先对表做笛卡尔积,然后再对结果集合进行选取操作,选取满足条件的部分作为结果,这里需要注意的是,如何把表看做一 集合,本来表中是一个二维数据,我们把表中的一行数据(即一个记录)看做是这个表集合中的一

回想sql语句中的各种连接

1. 内连接(Inner Join) 内连接是最常见的一种连接,它页被称为普通连接,而E.FCodd最早称之为自然连接. 以下是ANSI SQL-92标准 select * from    t_institution i inner join t_teller t on i.inst_no = t.inst_no where i.inst_no = "5801" 当中inner能够省略. 等价于早期的连接语法 select * from t_institution i, t_telle

提升笛卡尔乘积效率

最近项目的计算节点用的最多的是一个笛卡尔乘积算法,由于字典集合比较多,总高度有时会达到很高的一个量级,例如:1G.这样笛卡尔算法所 耗费的时间将很大,如何提交笛卡尔算法效率已经是当务之急. 笛卡尔乘积的算法很简单,复杂度就摆在这里O(high*n) :n指字典集合个数,high是所有集合的高度乘积.复杂度没法降低,所以我们从循环里面的运算下手,尽量降低循环内的计算,性能有所提升,下面是老版笛卡尔和新版笛卡尔的代码: 新版: 对比旧版,减少了high*(maxHigh-1)*2*n次除法,效率有所

oracle sql语句中使用if逻辑

l在 SQL 语句中使用IF-THEN-ELSE 逻辑 l l使用两种方法: •CASE 表达式:SQL99的语法,类似Basic,比较繁琐 •DECODE 函数:Oracle自己的语法,类似Java,比较简介 1 SQL> select ename,job, sal, case job when 'PRESIDENT' then 1.1*sal 2 2 when 'MANAGER' then 1.2*sal 3 3 when 'CLERK' then 1.3*sal 4 4 else 1.4*

SQL语句中DateAdd 函数说明

实践例子: 将借阅表中所有记录的归还日期加15天: 执行前情况: 执行后情况如下: update 借阅 set 归还日期=DateAdd ("D",15,归还日期) [详细讲解:] 返回 返回包含一个日期的 Variant (Date),这一日期还加上了一段时间间隔. 语法 DateAdd(interval, number, date) DateAdd 函数语法中有下列命名参数: interval 必要.字符串表达式,是所要加上去的时间间隔. number 必要.数值表达式,是要加上的