㈠ sql join on 多个表 怎么防止卡迪尔乘积
join 肯定就是笛卡尔积,所以你on 后面跟的条件就非常关键,如果没有on连接条件,就是完全的笛卡尔积,100条学生数据和100条成绩数据笛卡尔积就是10000条数据。
所以两个表join,需要按on后面的条件去连接就没啥事了,100条学生数据和100条成绩数据,on 学生表.学号=成绩表.学号,按这个条件join,就只会去连接满足连接条件的值
㈡ 写sql语句 一般什么时候出现笛卡尔积如何避免
楼主这个问题,表达的不是很准确。事实上你所说的什么时候出现笛卡尔积,应该是指一对多关系的时候,如果避免重复,而不是如何避免笛卡尔积。笛卡尔积在SQL中是有特殊的关联来求笛卡尔积的,求笛卡尔积的指令是cross join。那么回到如何避免重复的问题上,一般对于SQL开发来说,这是让很多人头疼的问题。一般呢,我个人把重复定义为如下三种情况:
第一种,原数据重复,指的是对应关系表中的数据本身就存在重复。但这种情况并不多,开发的时候会设定主键,一般情况较少。这种情况通常把需要使用的粒度数据distinct后,再关联就可以了。
第二种,就是维度重复。比如有区域表,分别是省市县三列,而你要统计的是到省的数据,这样你直接写join的时候会直接关联出很多条,这样通常使用子查询去除维度重复后,再关联即可
第三种,就是在一对多关系关联出来后的数据维度重复。有些东西是存放很多关系表的,在关系表关联后出现重复数据是个很正常的事情,但是可能由于需求比较特别,这样我们通常对这些数据进行排序组合,汇总后取数的原则,来选出我们需要的数据。
当然,说了这么多,其实怎么写一段SQL,还是要看需求和数据结构。具体的数据结构和具体的需求,定位了一段SQL该怎么写。多实践,你就会感悟到了
㈢ 怎样避免sql查询中出现笛卡儿积
1、可以想象你表中相同的字段应该是多对多的关系,只要把其中一个表里的数据改成没有重复的就可以了,如果允许的话。
2、如果不允许该数据,那就要麻烦些了,你要人为的再找几个字段,或者再添加几个新字段,是的这两个表满足上面第一种情况。
************
补充:
最好是在设计表的时候避免,把两个表关联的字段,在其中一个表中让他作为主键出现,这样一劳永逸。
㈣ SQL语句查询出现笛卡尔怎么办
两表连接如果要避免返回笛卡尔积,必须确保至少一方表是唯一的,否则在能查到记录的情况下,不论哪一种连接方式一定会返回笛卡尔积记录集的。
我们可以利用主键、唯一索引、distinct关键字和分组等手段来确保连接是一对多或一对一的,这样就可以防止笛卡尔积发生。具体的实现方法要根据数据结构和查询要求才能给出,可以说是千变万化的,需要具体问题具体分析解决。
㈤ oracle多表查询,表结构相同,但没有相关联
用union把两个查询的结果直接加到一起。
㈥ 在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关联出现笛卡尔积现象怎样避免
d与s没有产生关联,按照道理d与s会产生笛卡尔积但是你的查询结果并没有,这是因为完全用where条件来限制除了本身在实现你这个sql的时候,sql引擎有很多算法1种是产生3个表的笛卡尔积,按照where来过滤。产生结果2、按照e和d来连接,产生结果,在于s来3、按照d和s产生笛卡尔积,在按照e和s来过滤等等本身你看到的只是一个运算结果。运算过程你并没有看到,也就是sql引擎实际选择使用哪种方法。所以不是说它没有产生笛卡尔积,而是说它有可能产生,也有可能没有产生,根据它的算法自己决定。如果你想看到它到底有没有选择笛卡尔积的算法,那么就看看这个sql的实际执行计划就知道了。
㈧ oracle 怎么把sql的笛卡尔 or 去掉多余的表
第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小 SELECT * FROM table1 CROSS JOIN table2