SQL Server 2005 中的Row_Number()函數

我們知道,SQL Server 2005和SQL Server 2000 相比較,SQL Server 2005有很多新特性。這篇文章我們要討論其中的一個新函數Row_Number()。數據庫管理員和開發者已經期待這個函數很久了,現在終於等到了!


 通常,開發者和管理員在一個查詢裏,用臨時表和列相關的子查詢來計算產生行號。現在SQL Server 2005提供了一個函數,代替所有多餘的代碼來產生行號。

 我們假設有一個資料庫[EMPLOYEETEST],資料庫中有一個表[EMPLOYEE],你可以用下面的腳本來產生資料庫,表和對應的數據。

 USE [MASTER]
GO

IF  EXISTS (SELECT NAME FROM SYS.DATABASES WHERE NAME = N'EMPLOYEE TEST')
DROP DATABASE [EMPLOYEE TEST]
GO
CREATE DATABASE [EMPLOYEE TEST]
GO
USE [EMPLOYEE TEST]
GO

IF  EXISTS SELECT * FROM SYS.OBJECTS HERE OBJECT_ID = OBJECT_ID(N'[DBO].[EMPLOYEE]') AND TYPE IN (N'U'))
DROP TABLE [DBO].[EMPLOYEE]
GO

CREATE TABLE EMPLOYEE (EMPID INT, FNAME VARCHAR(50),LNAME VARCHAR(50))
GO
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (2021110, 'MICHAEL', 'POLAND')
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (2021110, 'MICHAEL', 'POLAND')
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (2021115, 'JIM', 'KENNEDY')
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (2121000, 'JAMES', 'SMITH')
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (2011111, 'ADAM', 'ACKERMAN')
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (3015670, 'MARTHA', 'LEDERER')
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (1021710, 'MARIAH', 'MANDEZ')
GO

 我們可以用下面的腳本查詢EMPLOYEE表。

 SELECT EMPID, RNAME, LNAME FROM EMPLOYEE

 這個查詢的結果應該如圖1.0 

2021110

MICHAEL

POLAND

2021110

MICHAEL

POLAND

2021115

JIM

KENNEDY

2121000

JAMES

SMITH

2011111

ADAM

ACKERMAN

3015670

MARTHA

LEDERER

1021710

MARIAH

MANDEZ


圖1.0

 在SQL Server 2005,要根據這個表中的數據產生行號,我通常使用下面的查詢。 

SELECT ROWID=IDENTITY(int,1,1) , EMPID, FNAME, LNAME INTO EMPLOYEE2 FROM EMPLOYEE ORDER BY EMPID

 這個查詢創建了一個新的表,用identify函數來產生行號。我們用下面的查詢來看看這個表的數據。 

SELECT ROWID, EMPID, FNAME, LNAME FROM EMPLOYEE2

 上面的查詢結果如圖1.1 

1

1021710

MARIAH

MANDEZ

2

2011111

ADAM

ACKERMAN

3

2021110

MICHAEL

POLAND

4

2021110

MICHAEL

POLAND

5

2021115

JIM

KENNEDY

6

2121000

JAMES

SMITH

7

3015670

MARTHA

LEDERER


圖1.1

 這個查詢結果很明顯EMP=2021110的行是重複的數據。

 要刪除EMPID=2021110的重複數據,我們必須在EMPLOYEE2表中刪除,不能直接在EMPLOYEE中刪除。

 SQL Server 2005提供了一個新的函數(Row_Number())來產生行號。我們可以使用這個新函數來刪除原來表中的重複數據,只用通常的表達方式再加上Row_Number()函數。

 讓我們用Row_Number()函數根據EMPID來產生ROWID。

 SELECT ROW_NUMBER() OVER (ORDER BY EMPID ASC) AS ROWID, * FROM EMPLOYEE

 上面的查詢結果如圖1.2 

1

1021710

MARIAH

MANDEZ

2

2011111

ADAM

ACKERMAN

3

2021110

MICHAEL

POLAND

4

2021110

MICHAEL

POLAND

5

2021115

JIM

KENNEDY

6

2121000

JAMES

SMITH

7

3015670

MARTHA

LEDERER


圖1.2

 在這個結果中,我們可以區別EMPID是2021110的重複數據。

 我們可以用通用表查詢表達式和Row_Numner()函數來選出重複的那行數據。

 WITH [EMPLOYEE ORDERED BY ROWID] AS
(SELECT ROW_NUMBER() OVER (ORDER BY EMPID ASC) AS ROWID, * FROM EMPLOYEE)
SELECT * FROM [EMPLOYEE ORDERED BY ROWID] WHERE ROWID =4

上面的查詢結果如圖1.3 

4

2021110

MICHAEL

POLAND


圖1.3

 這一行重複的數據可以用下面這個通用表和Row_Number()函數來刪除。

 WITH [EMPLOYEE ORDERED BY ROWID] AS
(SELECT ROW_NUMBER() OVER (ORDER BY EMPID ASC) AS ROWID, * FROM EMPLOYEE)
DELETE FROM [EMPLOYEE ORDERED BY ROWID] WHERE ROWID =4

 刪除以後,我們可以用下面的查詢語句看一下結果。

 SELECT * FROM EMPLOYEE

 這個查詢結果如圖1.4 

2021110

MICHAEL

POLAND

2021115

JIM

KENNEDY

2121000

JAMES

SMITH

2011111

ADAM

ACKERMAN

3015670

MARTHA

LEDERER

1021710

MARIAH

MANDEZ


圖 1.4

 這裏我們可以看到,重複的數據已經被刪除了。

 總結

在這篇文章中,我們討論了SQL Server 2005 的新特性Row_Number()函數,還有通常的表表達式,然後如何使用這兩個來刪除重複的行。

發佈了31 篇原創文章 · 獲贊 3 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章