《一道褒貶不一的 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 字段值最小的那一條留下,並選出其它的刪掉,如果只有一條,自然也不會被選
中了。這裡還要強調一下,大家一定要分清楚被操