方法一: SELECT 序號= (SELECT COUNT(客戶編號) FROM 客戶 AS a WHERE a.客戶編號<= b.客戶編號), 客戶編號,公司名稱 FROM 客戶 AS b ORDER BY 1; 方法二:
SELECT 序號= COUNT(*), a.客戶編號, a.公司名稱FROM 客戶 AS a, 客戶 AS b WHERE a.客戶編號>= b.客戶編號 GROUP BY a.客戶編號, b.公司名稱 ORDER BY 序號; 2. SQL Server 2005 構造序號列
方法一: SELECT RANK() OVER (ORDER BY 客戶編號 DESC) AS 序號, 客戶編號,公司名稱 FROM 客戶;
方法二: WITH TABLE AS (SELECT ROW_NUMBER() OVER (ORDER BY 客戶編號 DESC) AS 序號, 客戶編號,公司名稱 FROM 客戶) SELECT * FROM TABLE WHERE 序號 BETWEEN 1 AND 3; 3. Oracle 里 rowid 也可看做默認標識列 在Oracle中,每一條記錄都有一個rowid,rowid在整個數據庫中是唯一的,rowid確定了每條記錄是在Oracle中的哪一個數據文件、塊、行上。 在重復的記錄中,可能所有列的內容都相同,但rowid不會相同,所以只要確定出重復記錄中那些具有最大rowid的就可以了,其余全部刪除。
復制代碼 代碼如下:
select * from test;select * from test group by id having count(*)>1select * from test group by idselect distinct * from testdelete from test a where a.rowid!=(select max(rowid) from test b where a.id=b.id);扯遠了,回到原來的問題,除了采用數據結構的思想來處理,因為數據庫特有的事務處理,能夠把數據緩存在線程池里,這樣也相當于臨時表的功能,所以,我們還可以用游標來解決刪除重復記錄的問題。 declare @max int, @id int declare cur_rows cursor local for select id ,count(*) from test group by id having count(*) > 1 open cur_rows fetch cur_rows into @id ,@max while @@fetch_status=0 begin select @max = @max -1 set rowcount @max --讓這個時候的行數等于少了一行的統計數,想想看,為什么 delete from test where id = @id fetch cur_rows into @id ,@max end close cur_rows set rowcount 0 以上是閃電查閱一些資料寫出的想法,有考慮不周的地方,歡迎大家指出。