私奔
加油中的私奔```~~
最近想找工作,于是开始恶补基础知识,记得网上有位先生开过一句玩笑:“打字快了,却发现自己忘了键盘布局了;经验多了,却发现自己不会做题了”,确实有这种感触,好多面试题都能把我问的一愣一愣的。 要是google能随身携带该多好! 呵呵

今日又发现网上一个题目有问题,不过由于最近太多面试题搞得我焦头烂额,又不敢确定,但为了科学的严谨性,,只能前辛万苦下了一个sql2000过来自己测试。 才发现,果然,自己的方法才是对的,网上的所谓答案简直就是误人子弟。 后来一搜索,才知道,原来已经有人发现了。。 题目如下:

为管理岗位业务培训信息,建立3个表:
S (S#,SN,SD,SA)   S#,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年龄
C (C#,CN )        C#,CN       分别代表课程编号、课程名称
SC ( S#,C#,G )    S#,C#,G     分别代表学号、所选修的课程编号、学习成绩

4. 使用标准SQL嵌套语句查询选修全部课程的学员姓名和所属单位
网上流行的答案:
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#]))

以上代码是错误的, 关键是对Right join 的错误理解,正确方法(经过调试如下):
SELECT SN, SD FROM S
WHERE S#
IN (SELECT SC.S#
FROM SC,C 
where SC.C# = C.C#
GROUP BY SC.S#
HAVING COUNT(distinct(SC.C#))
= ( select count(*) from C ) )

由此可以给大家一个提示,看这些所谓的答案一定要多加思考,不要过于相信。 网上是不会有标准答案的。

posted on 2008-06-20 15:07  私奔  阅读(272)  评论(0编辑  收藏  举报