2011-05-20 81 views
0

以下問題:如何獲得表中記錄的位置(SQL Server)

我需要獲取表中記錄的位置。假設我在表格中有五條記錄:

Name: john doe, ID: 1 
Name: jane doe, ID: 2 
Name: Frankie Boy, ID: 4 
Name: Johnny, ID: 9 

現在,「弗蘭基男孩」在表中位列第三。但是如何從SQL服務器獲取這些信息?我可以統計身份證號碼,但他們不可靠,Frankie擁有ID 4,但因爲ID爲'3'的記錄被刪除,所以名列第三。

有沒有辦法?我意識到ROW_RANK,但這將是昂貴的,因爲我需要先選擇基本整個集合,然後才能對row_rank進行排名。

我正在使用MS SQL Server 2008 R2。

+0

你爲什麼需要記錄的位置?有沒有你想要做的特定查詢? – 2011-05-20 20:59:44

回答

2

您可以使用row_number()來「標記」行。你必須指定的方式對行進行排序:

select row_number() over (order by id) as PositionInTable 
,  * 
from YourTable 

如果性能是一個問題,你可以在一個新列的位置存儲:

update yt1 
set  PositionInTable = rn 
from YourTable yt1 
join (
     select row_number() over (order by id) as rn 
     ,  id 
     from YourTable 
     ) yt2 
on  yt1.id = yt2.id 

隨着指數PositionInTable,這會閃電般快。但是你必須在每次插入表格後更新它。

4

表沒有「位置」。表中的行(= set)由其主鍵值標識。只有結果行具有「位置」,當存在ORDER BY子句時,該位置可以是確定性的。假設表格(=集合)有一個位置只會導致問題,並且是錯誤的思維集合。

+0

並不總是,我明白你在說什麼,但在某些情況下,特別是在我正在處理的內容中,我在「結果」電子表格中導出單元格表。我想根據屬於特定單元格地址的條件突出顯示一個數字。我需要在SQL表中導出之前確定單元格地址 – 2015-04-10 11:30:53

+0

@EddyJawed:將問題提問爲問題,而不是評論。 – 2015-04-10 12:23:15

1

表格[概念]沒有秩序。除非您在select語句中指定ORDER BY來訂購結果集,否則結果可能會以任何順序返回。重複執行完全相同的SQL可能會返回每次執行時以不同順序設置的結果。

要獲取行號在一個特定的結果集,使用ROW_NUMBER()函數:

select row = row_number() over(order by id) , * 
from sysobjects 

這將在sysobjects行號分配給每個行作爲,如果表是由ID排序。

0

一個簡單的方法來做到這一點,而不必使用ROW_NUMBER將簡單地計算表中有多少行的索引小於或等於選定的索引,這將給出行號。

SELECT COUNT(*) FROM YourTable WHERE ID <= 4 -- Frankie Boy, Result = 3 

這可能不是針對您的特定場景最有效的方式,但它是實現它的一種簡單方法。