?
一、讓SELECT查詢結(jié)果額外增加自遞的偽序號列
在基于數(shù)據(jù)庫的系統(tǒng)的開發(fā)過程中,有時需要讓select返回的查詢結(jié)果中存在一列實(shí)際的數(shù)據(jù)庫表中并不存在的序號列,即在查詢結(jié)果中額外增加自增的偽序號列。從網(wǎng)絡(luò)上可以找到一些解決方案,但總結(jié)起來主要有三種:
1.使用數(shù)據(jù)庫自帶的序號函數(shù)實(shí)現(xiàn)
Oracle提供的ROWNUM,SQL Server 2005提供的RANK,ROW_NUMBER都可以比較簡單地實(shí)現(xiàn)這種需求,不過這種方法對我并不適用,因為我用的是SQL SERVER 2000。
2.使用臨時表實(shí)現(xiàn)
SQL的IDENTITY函數(shù)可以提供自增的序號,但只能用在帶有INTO table子句的SELECT語句中,所以如果可以使用臨時表的情況下可以使用這種實(shí)現(xiàn)方法。和第一種方法一樣,這種實(shí)現(xiàn)方法對我也不適用,因為現(xiàn)在的項目規(guī)定不能使用臨時表。
eg:
SELECT IDENTITY(INT,1,1) as seq,field1,field2,...,fieldn INTO tmpTableName FROM srcTableName;
SELECT * FROM tmpTableName;
DROP TABLE tmpTableName;
3.使用SQL標(biāo)準(zhǔn)語法實(shí)現(xiàn)
第三種思路是:將結(jié)果集中能確定一行數(shù)據(jù)唯一性的某列或多列組合成標(biāo)識符,再把結(jié)果集中小于等于標(biāo)識符的記錄數(shù)合計成一列,從而滿足需求。
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
在維護(hù)系統(tǒng)時,經(jīng)常能在遺留代碼里發(fā)現(xiàn)這樣的新增多條記錄實(shí)現(xiàn)方式:
1.循環(huán)構(gòu)造多條插入語句,再執(zhí)行一次批處理保存。
2.循環(huán)構(gòu)造多條插入語句,每條語句執(zhí)行一次保存。
對于使用第一種方式來新增從其他數(shù)據(jù)庫表中選擇的記錄的做法,我覺得是對數(shù)據(jù)庫資源的浪費(fèi),因為通常情況下這種實(shí)現(xiàn)方式完全可以通過一條INSERT語句實(shí)現(xiàn)。
可能你會說主鍵的生成是一個問題,但我并不認(rèn)為這會成為問題,在select時生成主鍵并不困難,上文就提到了內(nèi)容就可以在此處使用。對于采用第二種方法的“先輩”,我只能徹底無語,因為這種方式根本就沒有考慮數(shù)據(jù)庫的執(zhí)行效率和事務(wù)的完整性,一旦保存過程被中斷就會導(dǎo)致數(shù)據(jù)的不完整問題的出現(xiàn)。