序列表是進階 SQL 技巧(如數字表、日曆表、缺口分析)的基礎構建塊。
CREATE TABLE t_seq (seq INT);
DECLARE @i INT = 1;
WHILE @i <= 10 BEGIN
INSERT INTO t_seq VALUES (@i);
SET @i += 1;
END;
✅ 幾乎所有資料庫支援
❌ 需建表、有 I/O、不適合臨時大序列
| 資料庫 | 語法 | 說明 |
|---|---|---|
| Oracle | SELECT ROWNUM FROM user_objects WHERE ROWNUM <= 10 | 借用系統表行數 |
| SQL Server | SELECT TOP 10 ROW_NUMBER() OVER (ORDER BY object_id) FROM sys.objects | 分析函數產生序號 |
| SQL Server | SELECT IDENTITY(INT,1,1) AS seq INTO #t FROM sys.objects; SELECT seq FROM #t WHERE seq <= 10 | 身分欄位自增 |
❌ 受限於系統表行數,大序列需跨表 JOIN,產生 I/O
SELECT LEVEL AS seq FROM dual CONNECT BY LEVEL <= 10;
執行計劃統計:
0 recursive calls, 0 db block gets, 0 consistent gets, 0 physical reads
完全在記憶體運算,無任何磁碟存取。
WITH nums AS (
SELECT 1 AS n
UNION ALL
SELECT n + 1 FROM nums WHERE n < 10
)
SELECT n FROM nums
OPTION (MAXRECURSION 0);
MAXRECURSION 0 移除預設 100 層限制。
| 需求 | 推薦方法 |
|---|---|
| 跨平台、永久重用 | 建立實體數字表(一次建立、長期使用) |
| 臨時小序列、Oracle 環境 | CONNECT BY LEVEL |
| 臨時小序列、SQL Server 環境 | 遞歸 CTE |
| 已有大型系統表可借用 | ROW_NUMBER() / ROWNUM |