跳至內容
Astera Technology

一節要兩間房,只有一間空着為甚麼仍可安排?

逐一核對所有必要房間,不能只因找到其中一間便當作整節可行。

下載完整個案資料及參考答案 ↓

先準備用來排查的資料

S1 要 A 及 B,S2 只要 A。內連接後去重只代表有其中一間空房。應保留全部需求,比較必需房間數與已配對空房數,並用主鍵避免重複需求或空房資料令計數失準。

以下完整建表及資料只在新的 SQLite 測試資料庫執行。全部紀錄均為假設,數量以件計,輸入的 cents 金額欄以貨幣的分存整數;計算後的平均數可能不足整分。小型例子的各表均完整列在預覽。

假設輸入:session_requirements
課節編號房間編號
S1A
S1B
S2A
下載可編輯 CSV ↓
假設輸入:free_rooms
房間編號
A
下載可編輯 CSV ↓
可直接執行的完整測試資料
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
下載可編輯 CSV ↓
更正後的 SQLite 查詢
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
下載可編輯 CSV ↓

只有 A 空着。錯誤查詢把 S1 及 S2 都列可行,更正後只剩 S2。這只是所需資源是否齊備,未作預留;正式預約仍須再次核對。

套用前先測邊界及資料範圍

快照加入 B 後,兩節都齊所需房間。規則不是固定只需一間,而是各節自己的清單全部符合。

邊界測試要另開新的假設資料庫,重做完整建表及資料,只套用以下改動,再執行更正查詢。測試改動不可用於正式系統。

新假設副本內的邊界改動
INSERT INTO free_rooms VALUES ('B');
改動後再執行更正查詢的實際結果
課節編號
S1
S2
下載可編輯 CSV ↓

空房已按同一指定時段計算;沒有任何需求紀錄的課節未列出,須先訂政策。

以上錯誤、更正及邊界結果都已在 SQLite 執行,並與另行編寫的預期資料逐行核對。證據只適用於這組假設條件,未測其他資料庫、正式效能或你的現有資料結構。

相關資源