读书人

碰到的面试题请大家参谋参谋

发布时间: 2012-09-18 16:21:42 作者: rapoo

遇到的面试题,请大家参谋参谋
有以下三个表:
学生表A:StudentID, StudentName
课程表B:ClassID, ClassName
成绩表C:StudentID, ClassID, Score

写出以下条件的SQL:
① 名为“李四”的学生选修的所有课程
② 选修计算机原理且仅选修该一门课程的学生姓名
③ 至少有两门课程不及格的学生的所有课程成绩

我回来后重新做答的:

SQL code
SELECT A.StudentName,B.ClassName FROM C INNER JOIN A    ON A.StudentID=C.StudentID INNER JOIN B ON B.ClassID= C.ClassID    WHERE A.StudentName='李四'

SQL code
SELECT StudentID,ClassID INTO #Temp FROM C WHERE StudentID IN (SELECT StudentID FROM C GROUP BY StudentID HAVING COUNT(1) = 1)SELECT A.StudentName FROM #Temp D INNER JOIN A    ON A.StudentID=D.StudentID INNER JOIN B ON B.ClassID= D.ClassID    WHERE B.ClassName='计算机原理'DROP TABLE #Temp

SQL code
SELECT StudentID,Score INTO #Temp1 FROM C WHERE Score < 60SELECT StudentID INTO #Temp2 FROM #Temp1 GROUP BY StudentID HAVING COUNT(1) >= 2SELECT A.StudentName,B.ClassName,C.Score FROM C INNER JOIN A    ON A.StudentID=C.StudentID INNER JOIN B ON B.ClassID= C.ClassID    WHERE C.StudentID IN (SELECT StudentID FROM #Temp2) ORDER BY C.StudentIDDROP TABLE #Temp1,#Temp2


请大家帮忙点评解答一下

[解决办法]
改改别名
SQL code
-方法2可这样写select *from Binner join C as D on B.ClassID=D.ClassIDinner join A on A.StudentID=D.StudentIDwhere b.ClassName='计算机原理'and not exists(select 1 from C  where StudentID=D.StudentID and ClassID<>D.ClassID)方法3select *from Binner join C as D on B.ClassID=D.ClassIDinner join A on A.StudentID=D.StudentIDwhere  exists(select 1 from C  where StudentID=A.StudentID and Score<60 having count(distinct ClassID)>1)
[解决办法]
探讨

@roy_88:
方法2:
消息 4104,级别 16,状态 1,第 4 行
无法绑定由多个部分组成的标识符 "C.ClassID"。
消息 4104,级别 16,状态 1,第 5 行
无法绑定由多个部分组成的标识符 "C.StudentID"。
方法3:
消息 4104,级别 16,状态 1,第 4 行
无法绑定由多个部分组成的标识符 "C.ClassID"。
消息 4104……

读书人网 >SQL Server

热点推荐