《一道褒贬不一的 SQL 考试题》
playyuer 命题,playyuer、ccat 撰稿www.iTbulo.comw4l5r
相信有不少网友最近在网上见过一则名为《一道褒贬不一的 SQL 考试题》的帖子,这份
试题应当说还是有很多值得思考的地方。有兴趣的读者可以在阅读本文的答案分析部分
之前,尝试着作一下,如果你可以顺利地完成,至少说明你是一个有经验的 SQL 使用者。
下面我们先看一下题设:
二维表 T(F1,F2,F3,F4,F5,F6,F7) 表示如下关系:
┌──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┐
│ 学生ID │ 学生姓名 │ 课程ID │ 课程名称 │ 成绩 │ 教师ID │ 教师姓名 │
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
│ S3 │ 王五 │ K4 │ 政治 │ 53 │ T4 │ 赵老师 │
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
│ S1 │ 张三 │ K1 │ 数学 │ 61 │ T1 │ 张老师 │
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
│ S2 │ 李四 │ K3 │ 英语 │ 88 │ T3 │ 李老师 │
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
│ S1 │ 张三 │ K4 │ 政治 │ 77 │ T4 │ 赵老师 │
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
│ S2 │ 李四 │ K4 │ 政治 │ 67 │ T5 │ 周老师 │
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
│ S3 │ 王五 │ K2 │ 语文 │ 90 │ T2 │ 王老师 │
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
│ S3 │ 王五 │ K1 │ 数学 │ 55 │ T1 │ 张老师 │
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
│ S1 │ 张三 │ K2 │ 语文 │ 81 │ T2 │ 王老师 │
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
│ S4 │ 赵六 │ K2 │ 语文 │ 59 │ T1 │ 王老师 │
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
│ S1 │ 张三 │ K3 │ 英语 │ 37 │ T3 │ 李老师 │
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
│ S2 │ 李四 │ K1 │ 数学 │ 81 │ T1 │ 张老师 │
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
│ .... │ │ │ │ │ │ │
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
│ .... │ │ │ │ │ │ │
└──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┘
为便于大家更好的理解,我们将 T 表起名为"成绩表"www.iTbulo.comw4l5r
1.如果 T 表还有一字段 F 数据类型为自动增量整型(唯一,不会重复),
而且 T 表中含有除 F 字段外,请删除其它字段完全相同的重复多余的脏记录数据:www.iTbulo.comw4l5r
本问题就是一个清理"逻辑重复"记录的问题,当然,这种情况完全可以利用主键约束来
杜绝!然而,现实情况经常是原始数据在"洗涤"后,方可安全使用,而且逻辑主键过早的
约束,将会给采集原始数据带来不便,例如:从刷卡机上读取考勤记录。到了应用数据
的时候,脏数据就该被扫地出门了! 之所以题中要保留一个自动标识列,是因为它的确
是下面答案所必须的前提:www.iTbulo.comw4l5r
DELETE L
FROM "成绩表" L
JOIN "成绩表" R
ON L."学生ID" = R."学生ID" AND L."课程ID" = R."课程ID" AND L.F > R.Fwww.iTbulo.comw4l5r
这是思路最精巧且最直接有效的方法之一。用不等自联接,正好可以将同一组重复数
据中 F 字段值最小的那一条留下,并选出其它的删掉,如果只有一条,自然也不会被选
中了。这里还要强调一下,大家一定要分清楚被操