‘壹’ sql中笛卡尔积有什么用
某些情况下,用于 寻找连续日期中残缺的数据 的时候,可以先笛卡尔积做一个排列组合。然后和目标表进行关联,查找哪些数据缺少了。
例如有个考勤记录表,记录着100个人的2011年4月的考勤信息,理论上这些人应该每天都有记录的。
但是实际上某些人在某些天上面的数据,缺少了。
一天一天的查询,还是一个人一个人的查询,都有些麻烦。
这种情况下,可以针对 每个人 与 每一天 做一个 笛卡尔积 的处理。
然后与实际的表去关联。就很容易查询出结果了。
‘贰’ 谁能给我详细的解释下在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中笛卡尔积有什么用
某些情况下,用于 寻找连续日期中残缺的数据 的时候,可以先笛卡尔积做一个排列组合。然后和目标表进行关联,查找哪些数据缺少了。
例如有个考勤记录表,记录着100个人的2011年4月的考勤信息,理论上这些人应该每天都有记录的。
但是实际上某些人在某些天上面的数据,缺少了。
一天一天的查询,还是一个人一个人的查询,都有些麻烦。
这种情况下,可以针对 每个人 与 每一天 做一个 笛卡尔积 的处理。
然后与实际的表去关联。就很容易查询出结果了。
‘肆’ sql关联出现笛卡尔积现象怎样避免
d与s没有产生关联,按照道理d与s会产生笛卡尔积但是你的查询结果并没有,这是因为完全用where条件来限制除了本身在实现你这个sql的时候,sql引擎有很多算法1种是产生3个表的笛卡尔积,按照where来过滤。产生结果2、按照e和d来连接,产生结果,在于s来3、按照d和s产生笛卡尔积,在按照e和s来过滤等等本身你看到的只是一个运算结果。运算过程你并没有看到,也就是sql引擎实际选择使用哪种方法。所以不是说它没有产生笛卡尔积,而是说它有可能产生,也有可能没有产生,根据它的算法自己决定。如果你想看到它到底有没有选择笛卡尔积的算法,那么就看看这个sql的实际执行计划就知道了。
‘伍’ sql 语句 连内接和笛卡尔积那个效率高,主要什么因素影响这效率的
经分析。2个SQL 的执行计划一致。所以效率是一致的。
‘陆’ SQL语句查询出现笛卡尔怎么办
两表连接如果要避免返回笛卡尔积,必须确保至少一方表是唯一的,否则在能查到记录的情况下,不论哪一种连接方式一定会返回笛卡尔积记录集的。
我们可以利用主键、唯一索引、distinct关键字和分组等手段来确保连接是一对多或一对一的,这样就可以防止笛卡尔积发生。具体的实现方法要根据数据结构和查询要求才能给出,可以说是千变万化的,需要具体问题具体分析解决。
‘柒’ sql 有关笛卡尔积的问题
我测试建了几个表,你自己对照改成你得表名列名就行了
create table student
(
sid int identity primary key,
name nvarchar(50)
)
insert into student
select 'aaa' union
select 'bbb' union
select 'ccc'
go
create table F
(
fid int identity primary key,
fname nvarchar(50)
)
go
insert into F
select '数学' union
select '语文' union
select '英语'
go
create table Score
(
cid int identity primary key,
sid int,
fid int,
score int
)
go
insert into score
select 1,1,60 union
select 1,2,70 union
select 1,3,80 union
select 2,1,90
go
select * from student
select * from f
select * from score
go
select s.sid,f.fid,s.name,fname
from student s
cross join score c
cross join f
where
not exists
(
select cid from score where s.sid=score.sid and f.fid=score.fid
)
group by s.sid,s.name,fname,f.fid
order by sid
‘捌’ sql 笛卡尔积问题
select * from b bb where bb.id not in (select * from a,b where a.id=b.id);
思路:
写个子查询 把a和b中都有的数据查出来(select * from a,b where a.id=b.id) 然后排除
多看看查询以及关联查询 子查询的原理 就明白了
‘玖’ 写sql语句 一般什么时候出现笛卡尔积如何避免
楼主这个问题,表达的不是很准确。事实上你所说的什么时候出现笛卡尔积,应该是指一对多关系的时候,如果避免重复,而不是如何避免笛卡尔积。笛卡尔积在SQL中是有特殊的关联来求笛卡尔积的,求笛卡尔积的指令是cross join。那么回到如何避免重复的问题上,一般对于SQL开发来说,这是让很多人头疼的问题。一般呢,我个人把重复定义为如下三种情况:
第一种,原数据重复,指的是对应关系表中的数据本身就存在重复。但这种情况并不多,开发的时候会设定主键,一般情况较少。这种情况通常把需要使用的粒度数据distinct后,再关联就可以了。
第二种,就是维度重复。比如有区域表,分别是省市县三列,而你要统计的是到省的数据,这样你直接写join的时候会直接关联出很多条,这样通常使用子查询去除维度重复后,再关联即可
第三种,就是在一对多关系关联出来后的数据维度重复。有些东西是存放很多关系表的,在关系表关联后出现重复数据是个很正常的事情,但是可能由于需求比较特别,这样我们通常对这些数据进行排序组合,汇总后取数的原则,来选出我们需要的数据。
当然,说了这么多,其实怎么写一段SQL,还是要看需求和数据结构。具体的数据结构和具体的需求,定位了一段SQL该怎么写。多实践,你就会感悟到了
‘拾’ sql问题笛卡尔积问题。
就是笛卡尔积,记录条数就是A的记录条数*B的记录条数