高考申論題
105年
[資訊處理] 資料庫應用
第 一 題
📖 題組:
考慮以下記載討論版文章的關聯: Member(mId, mName, email) // 會員(編號, 姓名, 電子郵件信箱) Post(pId, mId, dateTime, title, pContent) // 文章(文章 id, 作者編號, 日期時間, 主旨, 內容) Reply(pId, rId, rmId, dateTime, rContent) // 回文(文章 id, 回文 id, 回文作者編號, 日期時間, 內容) 其中主鍵以底線表示,外鍵如下: Post(mId)參考到 Member(mId) Reply(pId)參考到 Post(pId) Reply(rmId)參考到 Member(mId)
考慮以下記載討論版文章的關聯: Member(mId, mName, email) // 會員(編號, 姓名, 電子郵件信箱) Post(pId, mId, dateTime, title, pContent) // 文章(文章 id, 作者編號, 日期時間, 主旨, 內容) Reply(pId, rId, rmId, dateTime, rContent) // 回文(文章 id, 回文 id, 回文作者編號, 日期時間, 內容) 其中主鍵以底線表示,外鍵如下: Post(mId)參考到 Member(mId) Reply(pId)參考到 Post(pId) Reply(rmId)參考到 Member(mId)
📝 此題為申論題,共 4 小題
小題 (一)
列出 2016 年有 PO 過文章(即出現在 Post 關聯裡)的會員之會員編號和姓名。(5 分)
思路引導 VIP
看到此題需先明確查詢目標(Member 表的 mId 與 mName)以及篩選條件(Post 表的 dateTime 在 2016 年)。接著思考需透過 mId 將 Member 與 Post 兩張表串接(或使用子查詢),並務必加上 DISTINCT 去除重複,以免同一人在 2016 年發布多篇文章而重複顯示。
小題 (二)
對於每一篇 PO 文,列出其 pId, PO 文時間,PO 文作者姓名,以及在 2016 年被回應的次數。(8 分)
思路引導 VIP
本題重點在於「對於每一篇 PO 文」皆需列出,即使該文章在 2016 年無回文,其回應次數也應顯示為 0。建議使用 LEFT JOIN 並將年份條件放在 ON 條件中搭配 GROUP BY,或直接使用 SELECT 中的關聯子查詢來達成。
小題 (三)
列出有原作者回應的 PO 文之 pId, title 和作者姓名。(7 分)
思路引導 VIP
解題關鍵在於將「原作者回應」轉化為關聯條件:同一篇文章中,發文者編號(Post.mId)必須與回文者編號(Reply.rmId)相同。可以使用 JOIN 連結 Post、Member 與 Reply 三個資料表,並務必加上 DISTINCT 避免原作者多次回文造成重複顯示;或者使用 EXISTS 子查詢來實作。
小題 (四)
找出 PO 文中(即出現在 Post 關聯裡)的內容有疑似西元日期的文章之 pId, title, PO 文作者姓名。所謂疑似西元日期是指出現連續四個數字,且第一個數字為 1 或 2,或是(連續)數字前有西元或公元的字眼。(10 分)
思路引導 VIP
首先確定需要關聯的資料表為 Post 與 Member,以取得文章及其作者姓名。其次,針對『疑似西元日期』的複雜定義,標準 SQL 的 LIKE 無法精確表達連續數字的條件,需思考使用字串模糊比對(如 T-SQL 的 LIKE 配合字元範圍 [0-9])或正規表示式(SIMILAR TO / REGEXP)來設定 WHERE 條件。