首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL 產生數字序列表的 4 種方法:從迴圈到遞歸查詢

     編輯:MySQL 資料庫相關知識

場景:產生 1 到 N 的序列(如 1~10)

序列表是進階 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、不適合臨時大序列

方法二:借用系統表偽欄/函數(快速但受限)

資料庫語法說明
OracleSELECT ROWNUM FROM user_objects WHERE ROWNUM <= 10借用系統表行數
SQL ServerSELECT TOP 10 ROW_NUMBER() OVER (ORDER BY object_id) FROM sys.objects分析函數產生序號
SQL ServerSELECT IDENTITY(INT,1,1) AS seq INTO #t FROM sys.objects; SELECT seq FROM #t WHERE seq <= 10身分欄位自增

❌ 受限於系統表行數,大序列需跨表 JOIN,產生 I/O

方法三:Oracle 遞歸查詢(零 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
完全在記憶體運算,無任何磁碟存取。

方法四:SQL Server 遞歸 CTE(2008+)

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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved