錯誤現象
-- 整體排序
SELECT * FROM ind WHERE indid > 10
UNION
SELECT * FROM ind WHERE indid < 9
ORDER BY indid DESC;
驗證:UNION 非簡單拼接
-- 錯誤:TOP 在子查詢,只限制該分支
SELECT TOP 2 * FROM t WHERE id = 4
UNION SELECT * FROM t WHERE id = 2
UNION SELECT * FROM t WHERE id = 1
ORDER BY id;
-- 結果:僅第一分支限 2 行,整體不止 2 行
-- 正確:用 ROWCOUNT(SQL Server)或最外層 LIMIT(MySQL/PostgreSQL)
-- MySQL:
(SELECT * FROM t WHERE id = 4
UNION SELECT * FROM t WHERE id = 2
UNION SELECT * FROM t WHERE id = 1)
ORDER BY id LIMIT 2;
UNION 內部執行流程
- 建立臨時表(Memory → 超大轉 InnoDB/MyISAM)
- 依序執行各
SELECT,結果寫入臨時表
UNION:寫入前檢查重複(哈希/排序);UNION ALL:直接追加
- 最終對臨時表執行 最外層 ORDER BY / LIMIT
- 返回結果集
分頁實戰模板