求教一个sql问题

[复制链接]
查看11 | 回复3 | 2005-10-30 17:05:33 | 显示全部楼层 |阅读模式
数据库是SQL SERVER 2000个人版
  
为管理岗位业务培训信息,建立3个表:
  S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年龄
  C (C#,CN ) C#,CN 分别代表课程编号、课程名称
  SC ( S#,C#,G ) S#,C#,G 分别代表学号、所选修的课程编号、学习成绩

  查询选修全部课程的学员姓名和所属单位
  SELECT SN,SD FROM S
  WHERE [S#] IN(
  SELECT [S#] FROM SC
  RIGHT JOIN
  C ON SC.[C#]=C.[C#] GROUP BY [S#]
  HAVING COUNT(*)=COUNT([S#]))
我自认为是对的
但是结果好像不正确
问题好像出在连接上了
按道理说一个人没有选的课程那条数据应该连接出来是NULL值
这样才能出现COUNT(*) 不等于COUNT(C#)
现在是那条数据没有出来,这样COUNT(*)=COUNT(#)
但是
  SELECT * FROM SC
  RIGHT JOIN
  C ON SC.[C#]=C.[C#]
AND [S#] = '00001'
就能查出来那条包含NULL的数据
我这里对GROUP BY 理解有误区?
如果是错误的
那么我要求查所有人,而不是只有'00001'这一个人,怎么查呢?
我是不是表达得不够清楚?


回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
为管理岗位业务培训信息,建立3个表:
  S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年龄
  C (C#,CN ) C#,CN 分别代表课程编号、课程名称
  SC ( S#,C#,G ) S#,C#,G 分别代表学号、所选修的课程编号、学习成绩

  查询选修全部课程的学员姓名和所属单位
  SELECT SN,SD FROM S
  WHERE [S#] IN(
  SELECT [S#] FROM SC
  RIGHT JOIN
  C ON SC.[C#]=C.[C#] GROUP BY [S#]
  HAVING COUNT(*)=COUNT([S#]))
我自认为是对的
但是结果好像不正确
问题好像出在连接上了
按道理说一个人没有选的课程那条数据应该连接出来是NULL值
这样才能出现COUNT(*) 不等于COUNT(C#)
现在是那条数据没有出来,这样COUNT(*)=COUNT(#)
====================================================
得到学习所有课程的学员:
select sc.s#, count(*) as nofrom sc ,c
where sc.c#=c.c#
group by s#
having count(*) =(select count(*) from c)
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
多谢斑竹

我现在是有些迷惑LEFT JOIN 和GROUP BY的问题
SELECT [S#] COUNT(*),COUNT(C#) FROM SC
  RIGHT JOIN
  C ON SC.[C#]=C.[C#] GROUP BY [S#]

SELECT [S#],COUNT(*),COUNT(C#) FROM SC
  RIGHT JOIN
  C ON SC.[C#]=C.[C#]AND [S#] = '00001'
有什么区别呢?
为什么第一个就是count(*)=count(c#)
而第二个不等呢?
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
你可以看看两个查询的 查询计划,体会一下两者的区别
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行