三表查询,,查询选修了全部课程的学生的姓名,求解答。。在线等

u011150962 2014-02-25 03:48:09
这是那三个表
学生表:student 课程表Course 选课表

sno,sname cno,cname sno,cno
0001,张三 001,语文 0001,001
0002,李四 002,数学 0001,002
0003,xxxx 003,英语 0001,003
0002,001
0002,002

,本来想用group by 查询选课表每个人的count(1) 与 课程表count,判断是否相等,但是这两个表没有外键关联,不一定对。请教更好的方法查询
...全文
967 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
u011150962 2014-02-25
  • 打赏
  • 举报
回复
引用 23 楼 DBA_Huangzj 的回复:
不过作为良好的设计,不存在的课程不应该可选,也就是选课的时候不会列出来,那么数据也不应该存进去,这是前端约束或者select语句的
谢谢版主提醒。。不过暂时没办法改啦,只能用你后面写的方法啦,。OK ,结贴
發糞塗牆 2014-02-25
  • 打赏
  • 举报
回复
不过作为良好的设计,不存在的课程不应该可选,也就是选课的时候不会列出来,那么数据也不应该存进去,这是前端约束或者select语句的
u011150962 2014-02-25
  • 打赏
  • 举报
回复
引用 21 楼 DBA_Huangzj 的回复:
是不是要这样?
--> 测试数据:[student]
if object_id('[student]') is not null drop table [student]
go 
create table [student]([sno] varchar(4),[sname] varchar(4))
insert [student]
select '0001','张三' union all
select '0002','李四' union all
select '0003','xxxx'
--> 测试数据:[ Course]
if object_id('[Course]') is not null drop table [Course]
go 
create table [Course]([cno] varchar(3),[cname] varchar(4))
insert [Course]
select '001','语文' union all
select '002','数学' union all
select '003','英语'
   
--> 测试数据:[选课表]
if object_id('[选课表]') is not null drop table [选课表]
go 
create table [选课表]([sno] varchar(4),[cno] varchar(3))
insert [选课表]
select '0001','001' union all
select '0001','002' union all
select '0001','003' union all
select '0002','001' union all
select '0002','002' union all
select '0002','004' union all
select '0002','002'

SELECT  s.sno ,
        s.sname ,
        COUNT(b.cno) [选课数量] ,
        ( SELECT    COUNT(1)
          FROM      course
        ) [总课数]
FROM    student s
        RIGHT  JOIN [选课表] b ON s.sno = b.sno
        LEFT JOIN course c ON b.cno = c.cno
GROUP BY s.sno ,
        s.sname
HAVING COUNT(b.cno)=( SELECT    COUNT(1)
          FROM      course
        )

		/*
		sno  sname 选课数量        总课数
---- ----- ----------- -----------
0001 张三    3           3

		*/
辛苦版主啦, 就是要这个答案
發糞塗牆 2014-02-25
  • 打赏
  • 举报
回复
是不是要这样?
--> 测试数据:[student]
if object_id('[student]') is not null drop table [student]
go 
create table [student]([sno] varchar(4),[sname] varchar(4))
insert [student]
select '0001','张三' union all
select '0002','李四' union all
select '0003','xxxx'
--> 测试数据:[ Course]
if object_id('[Course]') is not null drop table [Course]
go 
create table [Course]([cno] varchar(3),[cname] varchar(4))
insert [Course]
select '001','语文' union all
select '002','数学' union all
select '003','英语'
   
--> 测试数据:[选课表]
if object_id('[选课表]') is not null drop table [选课表]
go 
create table [选课表]([sno] varchar(4),[cno] varchar(3))
insert [选课表]
select '0001','001' union all
select '0001','002' union all
select '0001','003' union all
select '0002','001' union all
select '0002','002' union all
select '0002','004' union all
select '0002','002'

SELECT  s.sno ,
        s.sname ,
        COUNT(b.cno) [选课数量] ,
        ( SELECT    COUNT(1)
          FROM      course
        ) [总课数]
FROM    student s
        RIGHT  JOIN [选课表] b ON s.sno = b.sno
        LEFT JOIN course c ON b.cno = c.cno
GROUP BY s.sno ,
        s.sname
HAVING COUNT(b.cno)=( SELECT    COUNT(1)
          FROM      course
        )

		/*
		sno  sname 选课数量        总课数
---- ----- ----------- -----------
0001 张三    3           3

		*/
u011150962 2014-02-25
  • 打赏
  • 举报
回复
继续加分, 可惜分不多啦,
u011150962 2014-02-25
  • 打赏
  • 举报
回复
引用 18 楼 DBA_Huangzj 的回复:
写法很多种,不过既然写了上面的,就接着改下去
谢谢版主啦,。 既然问啦, 那我也再多问一下。。 如果把你上面的数据改下就不对啦,

--> 测试数据:[ Course]
if object_id('[Course]') is not null drop table [Course]
go 
create table [Course]([cno] varchar(3),[cname] varchar(4))
insert [Course]
select '001','语文' union all
select '002','数学' union all
select '003','英语'
  
--> 测试数据:[选课表]
if object_id('[选课表]') is not null drop table [选课表]
go 
create table [选课表]([sno] varchar(4),[cno] varchar(3))
insert [选课表]
select '0001','001' union all
select '0001','002' union all
select '0001','003' union all
select '0002','001' union all
select '0002','002' union all
select '0002','004' union all
select '0002','002'
多添加了两条数据, 其中有一个是004,这个在课程表中不存在,(可能存在这种情况)。 版主大人,如果是这样怎么破
發糞塗牆 2014-02-25
  • 打赏
  • 举报
回复
写法很多种,不过既然写了上面的,就接着改下去
u011150962 2014-02-25
  • 打赏
  • 举报
回复
引用 14 楼 yupeigu 的回复:
[quote=引用 8 楼 u011150962 的回复:] [quote=引用 6 楼 DBA_Huangzj 的回复:] 不过貌似你的逻辑有点问题吧?一个学生选了多少个课,和课程表中的数量有什么关系? select s.sno,s.sname,count(cno)[选课数量],(select count(1) from course) [总课数] from student s left join 选课 b on s.sno=b.sno right join course c on b.cno=c.cno group by s.sno,s.sname 这样可以不?
所以请教各位。有没有更好的办法。[/quote] 没看明白是什么意思[/quote] 就是想 查询选修了全部课程的学生的姓名,以上面数据为例,选修了全部课程的就只有张三。 ---下面的可以忽略 ,本来想用group by 查询选课表每个人的count(1) 与 课程表count,判断是否相等,但因为 两个表没有外键关联,有可能存在选课表录入错误, 比如,选课表有004(地理),所以被难倒啦
發糞塗牆 2014-02-25
  • 打赏
  • 举报
回复
--> 测试数据:[student]
if object_id('[student]') is not null drop table [student]
go 
create table [student]([sno] varchar(4),[sname] varchar(4))
insert [student]
select '0001','张三' union all
select '0002','李四' union all
select '0003','xxxx'
 
--> 测试数据:[ Course]
if object_id('[Course]') is not null drop table [Course]
go 
create table [Course]([cno] varchar(3),[cname] varchar(4))
insert [Course]
select '001','语文' union all
select '002','数学' union all
select '003','英语'
 
--> 测试数据:[选课表]
if object_id('[选课表]') is not null drop table [选课表]
go 
create table [选课表]([sno] varchar(4),[cno] varchar(3))
insert [选课表]
select '0001','001' union all
select '0001','002' union all
select '0001','003' union all
select '0002','001' union all
select '0002','002'
 
SELECT  s.sno ,
        s.sname ,
        COUNT(b.cno) [选课数量] ,
        ( SELECT    COUNT(1)
          FROM      course
        ) [总课数]
FROM    student s
        LEFT JOIN [选课表] b ON s.sno = b.sno
        RIGHT JOIN course c ON b.cno = c.cno
GROUP BY s.sno ,
        s.sname
HAVING COUNT(b.cno)=( SELECT    COUNT(1)
          FROM      course
        )
 /*
 sno  sname 选课数量        总课数
---- ----- ----------- -----------
0001 张三    3           3
 */
u011150962 2014-02-25
  • 打赏
  • 举报
回复
引用 13 楼 DBA_Huangzj 的回复:
--> 测试数据:[student]
if object_id('[student]') is not null drop table [student]
go 
create table [student]([sno] varchar(4),[sname] varchar(4))
insert [student]
select '0001','张三' union all
select '0002','李四' union all
select '0003','xxxx'

--> 测试数据:[ Course]
if object_id('[Course]') is not null drop table [Course]
go 
create table [Course]([cno] varchar(3),[cname] varchar(4))
insert [Course]
select '001','语文' union all
select '002','数学' union all
select '003','英语'

--> 测试数据:[选课表]
if object_id('[选课表]') is not null drop table [选课表]
go 
create table [选课表]([sno] varchar(4),[cno] varchar(3))
insert [选课表]
select '0001','001' union all
select '0001','002' union all
select '0001','003' union all
select '0002','001' union all
select '0002','002'

SELECT  s.sno ,
        s.sname ,
        COUNT(b.cno) [选课数量] ,
        ( SELECT    COUNT(1)
          FROM      course
        ) [总课数]
FROM    student s
        LEFT JOIN [选课表] b ON s.sno = b.sno
        RIGHT JOIN course c ON b.cno = c.cno
GROUP BY s.sno ,
        s.sname

/*
sno  sname 选课数量        总课数
---- ----- ----------- -----------
0002 李四    2           3
0001 张三    3           3
*/
辛苦版主啦, 如题, 麻烦版主帮我再查询选修了全部课程的学生的姓名,以上面数据为例,选修了全部课程的就只有张三
LongRui888 2014-02-25
  • 打赏
  • 举报
回复
引用 8 楼 u011150962 的回复:
[quote=引用 6 楼 DBA_Huangzj 的回复:] 不过貌似你的逻辑有点问题吧?一个学生选了多少个课,和课程表中的数量有什么关系? select s.sno,s.sname,count(cno)[选课数量],(select count(1) from course) [总课数] from student s left join 选课 b on s.sno=b.sno right join course c on b.cno=c.cno group by s.sno,s.sname 这样可以不?
所以请教各位。有没有更好的办法。[/quote] 没看明白是什么意思
發糞塗牆 2014-02-25
  • 打赏
  • 举报
回复
--> 测试数据:[student]
if object_id('[student]') is not null drop table [student]
go 
create table [student]([sno] varchar(4),[sname] varchar(4))
insert [student]
select '0001','张三' union all
select '0002','李四' union all
select '0003','xxxx'

--> 测试数据:[ Course]
if object_id('[Course]') is not null drop table [Course]
go 
create table [Course]([cno] varchar(3),[cname] varchar(4))
insert [Course]
select '001','语文' union all
select '002','数学' union all
select '003','英语'

--> 测试数据:[选课表]
if object_id('[选课表]') is not null drop table [选课表]
go 
create table [选课表]([sno] varchar(4),[cno] varchar(3))
insert [选课表]
select '0001','001' union all
select '0001','002' union all
select '0001','003' union all
select '0002','001' union all
select '0002','002'

SELECT  s.sno ,
        s.sname ,
        COUNT(b.cno) [选课数量] ,
        ( SELECT    COUNT(1)
          FROM      course
        ) [总课数]
FROM    student s
        LEFT JOIN [选课表] b ON s.sno = b.sno
        RIGHT JOIN course c ON b.cno = c.cno
GROUP BY s.sno ,
        s.sname

/*
sno  sname 选课数量        总课数
---- ----- ----------- -----------
0002 李四    2           3
0001 张三    3           3
*/
u011150962 2014-02-25
  • 打赏
  • 举报
回复
引用 3 楼 u010192842 的回复:
如果有重复的话,可以先去重,然后再按照去重后的数量来判断!
去重也不行,两个表没有外键关联,有可能存在选课表录入错误, 比如,选课表有004(地理),但是课程表没有。那结果就不对啦
發糞塗牆 2014-02-25
  • 打赏
  • 举报
回复
把你源代码贴上来看看
u011150962 2014-02-25
  • 打赏
  • 举报
回复
引用 9 楼 DBA_Huangzj 的回复:
包什么错??
from 附近有错
發糞塗牆 2014-02-25
  • 打赏
  • 举报
回复
包什么错??
u011150962 2014-02-25
  • 打赏
  • 举报
回复
引用 6 楼 DBA_Huangzj 的回复:
不过貌似你的逻辑有点问题吧?一个学生选了多少个课,和课程表中的数量有什么关系? select s.sno,s.sname,count(cno)[选课数量],(select count(1) from course) [总课数] from student s left join 选课 b on s.sno=b.sno right join course c on b.cno=c.cno group by s.sno,s.sname 这样可以不?
所以请教各位。有没有更好的办法。
u011150962 2014-02-25
  • 打赏
  • 举报
回复
引用 6 楼 DBA_Huangzj 的回复:
不过貌似你的逻辑有点问题吧?一个学生选了多少个课,和课程表中的数量有什么关系? select s.sno,s.sname,count(cno)[选课数量],(select count(1) from course) [总课数] from student s left join 选课 b on s.sno=b.sno right join course c on b.cno=c.cno group by s.sno,s.sname 这样可以不?
报错啦,
發糞塗牆 2014-02-25
  • 打赏
  • 举报
回复
不过貌似你的逻辑有点问题吧?一个学生选了多少个课,和课程表中的数量有什么关系? select s.sno,s.sname,count(cno)[选课数量],(select count(1) from course) [总课数] from student s left join 选课 b on s.sno=b.sno right join course c on b.cno=c.cno group by s.sno,s.sname 这样可以不?
u011150962 2014-02-25
  • 打赏
  • 举报
回复
加分,求详细解答。
加载更多回复(4)

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧