在資料庫開發中,常會遇到需要對沒有排序 ID 的資料表進行排序,並為每一行產生流水號的需求。這相當於在視圖中為每一行新增一個自動遞增的「ID」號。透過自我連結(Self-Join)與聚合函數,即可輕鬆達成。
假設有一個 cPayroll 資料表,其中 Badge 為員工編號。若要依 Badge 排序並產生行號 xOrder,可撰寫如下查詢:
SELECT a.Badge, COUNT(a.Badge) AS xOrder
FROM cPayroll a, cPayroll b
WHERE a.Badge >= b.Badge
GROUP BY a.Badge;
此語句利用「大於等於」條件進行自我連結,配合 COUNT 計算每個 Badge 之前(含自身)有多少筆資料,即為排序後的行號。
在掌握排序邏輯後,稍作修改即可實現「每 20 筆為一組」的分組功能,適合分頁顯示。例如:前 20 列為第 1 組(G1),21-40 列為第 2 組(G2),以此類推。
SELECT
Badge,
COUNT(a.Badge) AS xOrder,
CAST(((COUNT(a.Badge) - 1) / 20) + 1 AS VARCHAR(10)) AS [Group]
FROM cPayroll a, cPayroll b
WHERE a.Badge >= b.Badge
GROUP BY a.Badge;
產生的視圖資料如下:
| Badge | xOrder | Group |
|---|---|---|
| A1 | 1 | G1 |
| A2 | 2 | G1 |
| ... | ... | ... |
| B1 | 21 | G2 |
| B2 | 22 | G2 |
| ... | ... | ... |
| C1 | 41 | G3 |
有了這個視圖,應用程式即可用簡單的 SELECT * FROM ViewName WHERE [Group] = 'G1' 進行分組或分頁查詢,無需在前端處理複雜的分頁邏輯。
a.Badge >= b.Badge 讓每一行與「排序值小於或等於自己」的所有行配對。((行號 - 1) / 每組筆數) + 1,利用整數除法特性自動歸組。此技巧不依賴 IDENTITY 欄位,適用於任何可排序的欄位,是早期 SQL Server 版本(如 SQL 2000/2005)常用的分頁寫法。現代版本建議改用 ROW_NUMBER() 視窗函數,效能與可讀性更佳。