兩表關聯查詢:
期望結果:每行一個入住人對應一個房間號 (如張1→201, 王1→202)。
-- 表 A
OrderID | GuestName
1 | 張1
1 | 王1
2 | 張2
3 | 張3
-- 表 B
OrderID | RoomNo
1 | 201
1 | 202
訂單 1 有 2 位入住人、2 個房間。但沒有任何字段記錄「張1住201、王1住202」或反過來。
| 方案 | SQL 思路 | 結果 | 缺陷 |
|---|---|---|---|
| ROW_NUMBER 分組排序 | 按 GuestName/RoomNo 排序後按序號 JOIN | 張1→201, 王1→202 (或反) | 業務邏輯無依據,隨機分配,入住登記單會出錯 |
| MIN/MAX 聚合 | 取最小房間號給第一人 | 同上 | 同上 |
| 應用層補全 | 前端/業務代碼錄入映射關係 | 正確 | 需修改業務流程、補錄歷史數據 |
-- 核心關聯表:記錄每個入住人的具體房間分配
CREATE TABLE order_guest_room (
order_id INT,
guest_name VARCHAR(50), -- 或 guest_id 關聯客人主檔
room_no VARCHAR(20),
check_in_time DATETIME,
PRIMARY KEY (order_id, guest_name) -- 或 guest_id
);
-- 查詢變為簡單直觀
SELECT og.order_id, og.guest_name, og.room_no
FROM order_guest_room og
WHERE og.order_id = 1;
SQL 無法憑空創造不存在的業務關係。**「一訂單多入住人、多房間」若無「人-房」映射字段/表,精確分配在邏輯上是不可判定的**。解決路徑:補齊數據模型 (加關聯表/字段) → 修改業務錄入流程 → 歷史數據補錄,而非硬寫 SQL 強行分配。