日期:2014-05-18  浏览次数:20662 次

通过这三张表查询 同时选修了‘微机原理’和‘数据结构’的学生姓名和学号,怎么用SQL语言实现哦!!
学生表(sno sn sex age dept)
  s2 钱尔 男 18 信息
  s3 孙善 女 20 信息
  s4 李思 男 21 自动化
  s5 周武 男 19 计算机
  s6 吴丽 女 20 自动化
  s7 李器 男 18 外语
  s8 古名 男 计算机
  s9 赵一 女 17 计算机
选课表
SNO CNO SCORE
s2 c5 57
s2 c6 80
s2 c7
s3 c1 75
s3 c2 70
s3 c4 85
s4 c1 93
s4 c2 85
s4 c3 83
s5 c2 89
s9 c1 90
s9 c2 85

课程表
CNO CN CT ID_TC
C1 程序设计 60 1
C2 微机原理 80 2
C3 数字逻辑 60 3
C4 数据结构 80 4
C5 数据库 60 5
C6 编译原理 60 6
C7 操作系统 60 7

通过这三张表查询 同时选修了‘微机原理’和‘数据结构’的学生姓名和学号,怎么用SQL语言实现哦!!


------解决方案--------------------
SQL code
DECLARE @S TABLE(sno VARCHAR(2), sn NVARCHAR(4), sex NVARCHAR(1), age INT, dept NVARCHAR(10))
INSERT @S
SELECT N's2',  N'钱尔',  '男',  18,  N'信息' UNION ALL 
SELECT N's3',  N'孙善',  '女',  20,  N'信息' UNION ALL 
SELECT N's4',  N'李思',  '男',  21,  N'自动化' UNION ALL 
SELECT N's5',  N'周武',  '男',  19,  N'计算机' UNION ALL 
SELECT N's6',  N'吴丽',  '女',  20,  N'自动化' UNION ALL 
SELECT N's7',  N'李器',  '男',  18,  N'外语' UNION ALL 
SELECT N's8',  N'古名',  '男',  18,  N'计算机' UNION ALL 
SELECT N's9',  N'赵一',  '女',  17,  N'计算机'

DECLARE @SCORE TABLE(SNO VARCHAR(2), CNO VARCHAR(2), SCORE INT)
INSERT @SCORE
SELECT 's2',  'c5',  57 UNION ALL 
SELECT 's2',  'c6',  80 UNION ALL 
SELECT 's2',  'c7',  86 UNION ALL 
SELECT 's3',  'c1',  75 UNION ALL 
SELECT 's3',  'c2',  70 UNION ALL 
SELECT 's3',  'c4',  85 UNION ALL 
SELECT 's4',  'c1',  93 UNION ALL 
SELECT 's4',  'c2',  85 UNION ALL 
SELECT 's4',  'c3',  83 UNION ALL 
SELECT 's5',  'c2',  89 UNION ALL 
SELECT 's9',  'c1',  90 UNION ALL 
SELECT 's9',  'c2',  85

DECLARE @COURSE TABLE(CNO VARCHAR(2), CN NVARCHAR(10), CT INT, ID_TC INT)
INSERT @COURSE
SELECT 'C1',  N'程序设计',  60,  1 UNION ALL 
SELECT 'C2',  N'微机原理',  80,  2 UNION ALL 
SELECT 'C3',  N'数字逻辑',  60,  3 UNION ALL 
SELECT 'C4',  N'数据结构',  80,  4 UNION ALL 
SELECT 'C5',  N'数据库',  60,  5 UNION ALL 
SELECT 'C6',  N'编译原理',  60,  6 UNION ALL 
SELECT 'C7',  N'操作系统',  60,  7

SELECT DISTINCT S.SNO,SN
FROM @S AS S JOIN @SCORE AS SC ON S.SNO=SC.SNO
WHERE NOT EXISTS(SELECT 1 FROM (SELECT SNO,CNO FROM @SCORE WHERE SNO=S.SNO) AS SC2
                                                     RIGHT JOIN (SELECT DISTINCT CNO FROM @COURSE  WHERE  CN IN (N'微机原理',N'数据结构')) A
                         ON A.CNO=SC2.CNO
                                       WHERE  SC2.CNO IS NULL)
 /*
SNO  SN   
---- ---- 
s3   孙善
*/

------解决方案--------------------
select s.sno,s.sn from student s left join score sc on s.sno=sc.sno left join course c on sc.cno=c.cno 
where c.cn in ('微机原理','数据结构')
group by s.sno,s.sn
having count(*)>1