关于SQL语法,将子查询结果做为值,用做主查询的条件。主要是子查询去重复的问题。
有A,B两张表,A为学生表,表中字段为A_ID,A_NAME,B_ID;B为选修课程表,表中字段为B_ID,B_NAME,C_ID。C_ID为年级。A与B是N:N,B与C...
有A,B两张表,A为学生表,表中字段为A_ID,A_NAME,B_ID;B为选修课程表,表中字段为B_ID,B_NAME,C_ID。C_ID为年级。A与B是N:N,B与C也是N:N.
查询条件为统计年级是”3“的选课学生数量。
下面是我的查询语句:
Select Count(Distinct A_ID) from A where B_ID in(Select Distinct B_ID from B where C_ID='3')。
一个学生可选多门课程,根据B_ID查出来的COUNT(A_ID)是会有重复的,那么主查询中用Distinct 是没有问题。
但是子查询中根据C_ID查询出来的B_ID是不会重复的,所以,在子查询中的Distinct是不是必要的?如果没有Distinct,那么对查询速度会不会有影响?
在程序中写的SQL语句,没有报错没有异常,但是子查询不加Distinct的时候速度就非常慢,加了就正常了,请问有人知道这是为什么吗? 展开
查询条件为统计年级是”3“的选课学生数量。
下面是我的查询语句:
Select Count(Distinct A_ID) from A where B_ID in(Select Distinct B_ID from B where C_ID='3')。
一个学生可选多门课程,根据B_ID查出来的COUNT(A_ID)是会有重复的,那么主查询中用Distinct 是没有问题。
但是子查询中根据C_ID查询出来的B_ID是不会重复的,所以,在子查询中的Distinct是不是必要的?如果没有Distinct,那么对查询速度会不会有影响?
在程序中写的SQL语句,没有报错没有异常,但是子查询不加Distinct的时候速度就非常慢,加了就正常了,请问有人知道这是为什么吗? 展开
3个回答
展开全部
给你说一下有distinct和无distinct的执行过程吧
有distinct的时候,是Select Distinct B_ID from B where C_ID='3' 这句去表里读id,最后取出不重复的,然后Select Count(Distinct A_ID) from A where B_ID in 这个查询去刚才查的结果里循环取数
但是如果=3的那个不用distinct的话,也是取出一堆数来,但是有很多应该是重复的,前一句还是要到这个结果集中去循环,这个主要看数据量吧
如果你后边括号里的数据量有几万,那就要循环几万次,这个时候后边用distinct的话比较合适
如果后边不加distinct,而数据量几百几千条,循环也就是几百几千次
有distinct的时候,是Select Distinct B_ID from B where C_ID='3' 这句去表里读id,最后取出不重复的,然后Select Count(Distinct A_ID) from A where B_ID in 这个查询去刚才查的结果里循环取数
但是如果=3的那个不用distinct的话,也是取出一堆数来,但是有很多应该是重复的,前一句还是要到这个结果集中去循环,这个主要看数据量吧
如果你后边括号里的数据量有几万,那就要循环几万次,这个时候后边用distinct的话比较合适
如果后边不加distinct,而数据量几百几千条,循环也就是几百几千次
更多追问追答
追问
子查询不用distinct查出的数据和使用了distinct查出的数据是一样的呢。
in 就是where 的一个循环,这个我知道。子查询查出的B_ID只有一个的时候是没有问题的,但如果查出2个不同的B_ID就会速度很慢了。会不会在内部有什么执行过程会影响到速度?
追答
数据一样,因为distinct b_id 的时候
数据是1,2,3,4,5类似这样的
但不用distinct的时候,是1,1,1,2,3,4,4,5,就是可能会出现N个1,2,3,4,5
所以这个查询要根据你实际情况而定,如果B表里数据量很多条,但是基本都是雷同的,可用distinct,如果基本每条都不一样的话,不建议用distinct
展开全部
子查询中的distinct是对查询速度应该是有影响的。
例如 张三和李四都选修了一门课程,且都在3年级。那么你的子查询不加distinct查出结果就是2个,加了distinct查出的B_ID就只有一个。
所以如果你用子查询来查的话,建议加上distinct。
如果可以不用子查询,建议使用如下语句
Select Count(discint A.A_ID) From A, B Where A.B_ID=B.B_ID and B.C_ID='3')
例如 张三和李四都选修了一门课程,且都在3年级。那么你的子查询不加distinct查出结果就是2个,加了distinct查出的B_ID就只有一个。
所以如果你用子查询来查的话,建议加上distinct。
如果可以不用子查询,建议使用如下语句
Select Count(discint A.A_ID) From A, B Where A.B_ID=B.B_ID and B.C_ID='3')
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
表的设计就有问题,太乱
追问
额,表设计是我后来想的,和原来的差不多。
原来的是这样的:表A是客户信息表,主键客户ID,表B是客户组项目表,主键客户组ID,表C是项目表,主键项目ID。
A中有客户组ID,B中有项目ID,一个客户可以属于多个客户组。然后一个项目有多个客户组。
条件就是,某一个项目中包含的客户数量。可能有点难以理解。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询