❶ sql中笛卡尔积有什么用
某些情况下,用于 寻找连续日期中残缺的数据 的时候,可以先笛卡尔积做一个排列组合。然后和目标表进行关联,查找哪些数据缺少了。
例如有个考勤记录表,记录着100个人的2011年4月的考勤信息,理论上这些人应该每天都有记录的。
但是实际上某些人在某些天上面的数据,缺少了。
一天一天的查询,还是一个人一个人的查询,都有些麻烦。
这种情况下,可以针对 每个人 与 每一天 做一个 笛卡尔积 的处理。
然后与实际的表去关联。就很容易查询出结果了。
❷ SQL的笛卡尔积问题,我现在需要从这3张表中取出这些数据,但出现重复,求正确语句
消除笛卡尔乘积最根本的原因在于唯一ID,就像学号,一个学生就只有一个学号,学号就是这个学生的唯一标识码。使用左连接,当左边的ID和右边ID都是唯一时,就不会产生笛卡尔现象。 Selectwms_process_doc.CODE,wms_process_doc.COMPANY_ID,wms_process_doc.DESCRIPTION,wms_process_doc.CREATED_TIME,wms_process_doc.STORAGE_DATE,wms_processplan.CODE, wms_processplan.NAME, wms_processplan.PACKAGE_UNIT_ID, wms_process_doc.EXPIRE_DATE, wms_process_doc.PRODUCE_DATE, wms_process_doc.PROCESS_QUANTITY, wms_processplan_detail.QUANTITY_BU, wms_process_doc.LOCATION_CODE,wms_process_doc.BILL_TYPE_ID,wms_process_doc.PICKED_QUANTITY FROM wms_process_doc left join wms_processplan on wms_process_doc.XX = s_processplan.XX left join wms_processplan_detail ON s_processplan.XX = wms_processplan_detail .XX
❸ SQL语言如何把A表的一列与B表建立笛卡尔乘积
使用交叉连接产生笛卡尔乘积
select
*
from
A
cross
join
B
或不使用任何连接条件,也可产生笛卡尔乘积
select
*
from
A,B
笛卡尔乘积与列无关,如果你想显示某几列,就在select后面指定相应的列名即可.
补充:
用A表的某列与B表做笛卡尔积,道理是一样的,你可以把该列看做是一个表源.如:
select
*
from
(select
distinct
某列
from
A)
C
cross
join
B
❹ SQL三张表连接笛卡尔积是多少
table1(2条数据)
结论: 最终得到的数量为table1 join table2后的交集在×table3的数量
2x2=4
❺ 写sql语句 一般什么时候出现笛卡尔积如何避免
楼主这个问题,表达的不是很准确。事实上你所说的什么时候出现笛卡尔积,应该是指一对多关系的时候,如果避免重复,而不是如何避免笛卡尔积。笛卡尔积在SQL中是有特殊的关联来求笛卡尔积的,求笛卡尔积的指令是cross join。那么回到如何避免重复的问题上,一般对于SQL开发来说,这是让很多人头疼的问题。一般呢,我个人把重复定义为如下三种情况:
第一种,原数据重复,指的是对应关系表中的数据本身就存在重复。但这种情况并不多,开发的时候会设定主键,一般情况较少。这种情况通常把需要使用的粒度数据distinct后,再关联就可以了。
第二种,就是维度重复。比如有区域表,分别是省市县三列,而你要统计的是到省的数据,这样你直接写join的时候会直接关联出很多条,这样通常使用子查询去除维度重复后,再关联即可
第三种,就是在一对多关系关联出来后的数据维度重复。有些东西是存放很多关系表的,在关系表关联后出现重复数据是个很正常的事情,但是可能由于需求比较特别,这样我们通常对这些数据进行排序组合,汇总后取数的原则,来选出我们需要的数据。
当然,说了这么多,其实怎么写一段SQL,还是要看需求和数据结构。具体的数据结构和具体的需求,定位了一段SQL该怎么写。多实践,你就会感悟到了
❻ 谁能给我详细的解释下在sql中的笛卡尔是怎么样的!
SQL中大概有这么几种JOIN:
cross join
inner join
left outer join
right outer join
full outer join
他们都是基于cross join(笛卡尔乘积),举例说明
A_test表
Id a_name a_describe
1 a11111 a11111
2 a22222 a22222
3 a33333 a33333
B_test表
Id b_name b_describe
1 b11111 01
1 b11111 02
2 b22222 01
2 b22222 02
3 b44444 04
select * from a_test a //查询出所有a表中的所有记录 3条
select * from b_test b //查询出所有b表中的所有记录 5条
select * from a_test a cross join b_test b //a b 两表的笛卡尔乘积 即所有的组合 共15条记录
结果:
1 a11111 a111111 1 b11111 01
1 a11111 a111111 1 b11111 02
1 a11111 a111111 2 b22222 01
1 a11111 a111111 2 b22222 02
1 a11111 a111111 4 b44444 01
2 a22222 a222222 1 b11111 01
2 a22222 a222222 1 b11111 02
2 a22222 a222222 2 b22222 01
2 a22222 a222222 2 b22222 02
2 a22222 a222222 4 b44444 01
3 a33333 a333333 1 b11111 01
3 a33333 a333333 1 b11111 02
3 a33333 a333333 2 b22222 01
3 a33333 a333333 2 b22222 02
3 a33333 a333333 4 b44444 01
1 a11111 a111111 1 b11111 01
1 a11111 a111111 1 b11111 02
1 a11111 a111111 2 b22222 01
1 a11111 a111111 2 b22222 02
1 a11111 a111111 4 b44444 01
2 a22222 a222222 1 b11111 01
2 a22222 a222222 1 b11111 02
2 a22222 a222222 2 b22222 01
2 a22222 a222222 2 b22222 02
2 a22222 a222222 4 b44444 01
3 a33333 a333333 1 b11111 01
3 a33333 a333333 1 b11111 02
3 a33333 a333333 2 b22222 01
3 a33333 a333333 2 b22222 02
3 a33333 a333333 4 b44444 01
select * from a_test a inner join b_test b on a.id = b.id
//在笛卡尔乘积的结果集中去掉不符合连接条件的行 包含于笛卡尔乘积
结果:
1 a11111 a111111 1 b11111 01
1 a11111 a111111 1 b11111 02
2 a22222 a222222 2 b22222 01
2 a22222 a222222 2 b22222 02
1 a11111 a111111 1 b11111 01
1 a11111 a111111 1 b11111 02
2 a22222 a222222 2 b22222 01
2 a22222 a222222 2 b22222 02
select * from a_test a left outer join b_test b on a.id = b.id
//是在inner join的结果集上加上左面表中没被选上的不相等的记录,不包含于笛卡尔乘积
//行的右表部分每个字段都用NUll填充
结果:
1 a11111 a111111 1 b11111 01
1 a11111 a111111 1 b11111 02
2 a22222 a222222 2 b22222 01
2 a22222 a222222 2 b22222 02
3 a33333 a333333 NULL NULL NULL
select * from a_test a right join b_test b on a.id = b.id
//是在inner join的结果集上加上右面表中没被选上的不相等的记录,不包含于笛卡尔乘积
//行的左表部分每个字段都用NUll填充
1 a11111 a111111 1 b11111 01
1 a11111 a111111 1 b11111 02
2 a22222 a222222 2 b22222 01
2 a22222 a222222 2 b22222 02
NULL NULL NULL 4 b44444 01
select * from a_test a full outer join b_test b on a.id = b.id
//是在inner join的结果集上加上左、右两面表中没被选上的不相等的记录,不包含于笛卡尔乘积
//行的右、左表两部分每个字段都用NUll填充
1 a11111 a111111 1 b11111 01
1 a11111 a111111 1 b11111 02
2 a22222 a222222 2 b22222 01
2 a22222 a222222 2 b22222 02
NULL NULL NULL 4 b44444 01
3 a33333 a333333 NULL NULL NULL
❼ sql关联出现笛卡尔积现象怎样避免
d与s没有产生关联,按照道理d与s会产生笛卡尔积但是你的查询结果并没有,这是因为完全用where条件来限制除了本身在实现你这个sql的时候,sql引擎有很多算法1种是产生3个表的笛卡尔积,按照where来过滤。产生结果2、按照e和d来连接,产生结果,在于s来3、按照d和s产生笛卡尔积,在按照e和s来过滤等等本身你看到的只是一个运算结果。运算过程你并没有看到,也就是sql引擎实际选择使用哪种方法。所以不是说它没有产生笛卡尔积,而是说它有可能产生,也有可能没有产生,根据它的算法自己决定。如果你想看到它到底有没有选择笛卡尔积的算法,那么就看看这个sql的实际执行计划就知道了。
❽ 在SQL-SERVER2000中对同一个数据库多张表进行查询时怎样避免笛卡儿乘积
在写join类型的语句的时候,最好使用join来代替直接用“,”分隔多个表。这样必须提供on条件才能进行查询。当然,join的条件一定要设置好,否则也会出现笛卡尔积的。
比如tableA和TableB向关联的是ID字段
如果用“,“分隔两个表的话语据应该如下
select count(*)
from tableA ,TableB
where TableA.id=TableB.id
如果把where 语句漏掉就出现笛卡尔积了
select count(*)
from tableA ,TableB
同样,写成join的话,如果不指定on里的条件的话,语法是错的
select count(*)
from TableA join TableB
on TableA.id=TableB.id
但是如果再on里指定了一个错误的关联条件的话,也是会出现笛卡尔积的,比如:
select count(*)
from TableA join TableB
on 1=1
当然一般人不会闲得去把on条件设置成1=1,不过这是举个例子,就是为了说明on的筛选条件一定要设置好。
❾ SQL中笛卡尔积有什么用
某些情况下,用于 寻找连续日期中残缺的数据 的时候,可以先笛卡尔积做一个排列组合。然后和目标表进行关联,查找哪些数据缺少了。
例如有个考勤记录表,记录着100个人的2011年4月的考勤信息,理论上这些人应该每天都有记录的。
但是实际上某些人在某些天上面的数据,缺少了。
一天一天的查询,还是一个人一个人的查询,都有些麻烦。
这种情况下,可以针对 每个人 与 每一天 做一个 笛卡尔积 的处理。
然后与实际的表去关联。就很容易查询出结果了。