日期:2014-05-17  浏览次数:20394 次

遇到的面试题,请大家参谋参谋
有以下三个表:
学生表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 < 60
SELECT StudentID INTO #Temp2 FROM #Temp1 GROUP BY StudentID HAVING COUNT(1) >= 2
SELECT 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.StudentID
DROP TABLE #Temp1,#Temp2


请大家帮忙点评解答一下

------解决方案--------------------
改改别名
SQL code
-方法2可这样写
select 
*
from B
inner join C as D on B.ClassID=D.ClassID
inner join A on A.StudentID=D.StudentID
where b.ClassName='计算机原理'
and not exists(select 1 from C  where StudentID=D.StudentID and ClassID<>D.ClassID)

方法3

select 
*
from B
inner join C as D on B.ClassID=D.ClassID
inner join A on A.StudentID=D.StudentID
where  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……