1. 程式人生 > >SQL 查詢結果自動遞增序列號

SQL 查詢結果自動遞增序列號

一、讓SELECT查詢結果額外增加自遞的偽序號列
在基於資料庫系統的開發過程中,有時需要讓select返回的查詢結果中存在一列實際的資料庫表中並不存在的序號列,即在查詢結果中額外增加自增的偽序號列。從網路上可以找到一些解決方案,但總結起來主要有三種:
1.使用資料庫自帶的序號函式實現
Oracle提供的ROWNUM,SQL Server 2005提供的RANK,ROW_NUMBER都可以比較簡單地實現這種需求,不過這種方法對我並不適用,因為我用的是SQL SERVER 2000。

2.使用臨時表實現
SQL的IDENTITY函式可以提供自增的序號,但只能用在帶有INTO table子句的SELECT語句中,所以如果可以使用臨時表的情況下可以使用這種實現方法。和第一種方法一樣,這種實現方法對我也不適用,因為現在的專案規定不能使用臨時表。
eg:
SELECT IDENTITY(INT,1,1) as seq,field1,field2,...,fieldn INTO tmpTableName FROM srcTableName;
SELECT * FROM tmpTableName;
DROP TABLE tmpTableName;

3.使用SQL標準語法實現
第三種思路是:將結果集中能確定一行資料唯一性的某列或多列組合成識別符號,再把結果集中小於等於識別符號的記錄數合計成一列,從而滿足需求。
eg:
SELECT (SELECT COUNT(id) FROM srcTableName AS tbl1 WHERE tbl1.id<=tbl2.id) as seq,field1,field2,...,fieldn
FROM srcTableName AS tbl2 ORDER BY 1 ;
二、使用INSERT新增行
INSERT語句可給表新增一個或多個新行,增加單行的語法沒什麼可說的,此處描述的是使用多行的情況,語法為:
INSERT INTO destTable (field1,field2,...,fieldn) FROM SELECT field1,field2,...,fieldn FROM srcTable
在維護系統時,經常能在遺留程式碼
裡發現這樣的新增多條記錄實現方式:
1.迴圈構造多條插入語句,再執行一次批處理儲存。
2.迴圈構造多條插入語句,每條語句執行一次儲存。
對於使用第一種方式來新增從其他資料庫表中選擇的記錄的做法,我覺得是對資料庫資源的浪費,因為通常情況下這種實現方式完全可以通過一條INSERT語句實現。
可能你會說主鍵的生成是一個問題,但我並不認為這會成為問題,在select時生成主鍵並不困難,上文就提到了內容就可以在此處使用。對於採用第二種方法的“先輩”,我只能徹底無語,因為這種方式根本就沒有考慮資料庫的執行效率和事務的完整性,一旦儲存過程被中斷就會導致資料的不完整問題的出現。
三、CONVERT函式的使用
CONVERT可以用在不同資料型別之間的轉換,語法為:
CONVERT (data_type[(length)], expression [, style])
在專案中使用到這個函式的情形多是將日期形轉換為字串,如將日期型轉換為'2007-06-05'或'2007-06-05 12:30:50',實現程式碼為convert(varchar(10),datetime,120)、convert(varchar(19),datetime,120)

四、SQL函式實現

select row_number()OVER(ORDER BY name DESC),name from biao

row_number() SQL自帶函式