先準備用來排查的資料
S1 要 A 及 B,S2 只要 A。內連接後去重只代表有其中一間空房。應保留全部需求,比較必需房間數與已配對空房數,並用主鍵避免重複需求或空房資料令計數失準。
以下完整建表及資料只在新的 SQLite 測試資料庫執行。全部紀錄均為假設,數量以件計,輸入的 cents 金額欄以貨幣的分存整數;計算後的平均數可能不足整分。小型例子的各表均完整列在預覽。
| 課節編號 | 房間編號 |
|---|---|
| S1 | A |
| S1 | B |
| S2 | A |
| 房間編號 |
|---|
| A |
CREATE TABLE session_requirements(session_id TEXT,room_id TEXT,PRIMARY KEY(session_id,room_id));
CREATE TABLE free_rooms(room_id TEXT PRIMARY KEY);
INSERT INTO session_requirements VALUES ('S1','A'),('S1','B'),('S2','A');
INSERT INTO free_rooms VALUES ('A');重現錯誤結果,再核對更正
SELECT DISTINCT s.session_id FROM session_requirements s JOIN free_rooms f ON f.room_id=s.room_id ORDER BY s.session_id;| 課節編號 |
|---|
| S1 |
| S2 |
SELECT s.session_id FROM session_requirements s LEFT JOIN free_rooms f ON f.room_id=s.room_id
GROUP BY s.session_id HAVING COUNT(*)=COUNT(f.room_id) ORDER BY s.session_id;| 課節編號 |
|---|
| S2 |
只有 A 空着。錯誤查詢把 S1 及 S2 都列可行,更正後只剩 S2。這只是所需資源是否齊備,未作預留;正式預約仍須再次核對。
套用前先測邊界及資料範圍
快照加入 B 後,兩節都齊所需房間。規則不是固定只需一間,而是各節自己的清單全部符合。
邊界測試要另開新的假設資料庫,重做完整建表及資料,只套用以下改動,再執行更正查詢。測試改動不可用於正式系統。
INSERT INTO free_rooms VALUES ('B');| 課節編號 |
|---|
| S1 |
| S2 |
空房已按同一指定時段計算;沒有任何需求紀錄的課節未列出,須先訂政策。
以上錯誤、更正及邊界結果都已在 SQLite 執行,並與另行編寫的預期資料逐行核對。證據只適用於這組假設條件,未測其他資料庫、正式效能或你的現有資料結構。