2013-10-09 49 views
1

假設我有如下表:有效的方式,從記錄獲得的唯一值

CREATE TABLE test(
id int identity not null primary key, 
code nvarchar(50), 
name nvarchar(50), 
node_code nvarchar(50), 
parent_node nvarchar(50), 
prop1 int, 
prop2 datetime, 
prop3 nvarchar(50) 
); 

的代碼和名稱是相關的,並且它們形成一個關鍵特性。因此,該表可以包含以下數據:

CODE001 NAME001 [3 PROPS] 
CODE001 NAME001 [3 PROPS] 
CODE002 NAME002 [3 PROPS] 
CODE002 NAME002 [3 PROPS] 
... 

我知道這是不是一個很好的設計,但我不得不忍受它。

現在的問題是我想獲得代碼名稱列表及其節點代碼和父節點代碼(節點代碼對於代碼和名稱鍵唯一),但不包含屬性。我可以這樣做:

select DISTINCT code, name, node_code, parent_code from test 

但我嚴重懷疑這是否是最有效的方法。我需要建議。

+0

選擇代碼,名稱,node_code,parent_code從測試組通過代碼,名稱,node_code,parent_code。這是我如何獲得獨特的價值,而不是使用不同的。儘管不知道最有效的方法。 – zundarz

回答

0

你可以這樣做:

SELECT code, name, node_code, parent_code ,prop1, prop2, prop3 FROM 
(
    SELECT 
     ROW_NUMBER() OVER (PARTITION BY code, name, node_code, parent_code ORDER BY code, name, node_code, parent_code) AS RN, 
     code, name, node_code, parent_code,prop1,prop2,prop3 
    FROM test 
) TEST2 
WHERE TEST2.RN = 1 

你可以學習更多關於這個here

+0

感謝您的回答,但是這條SQL語句似乎是非常慢的200萬條記錄。以下SQL非常快(1秒): 選擇一個代碼, (從代碼= a.code的測試中選擇top 1的名稱), (從test where code = a.code選擇top 1節點代碼), (從代碼= a.code的測試中選擇top 1 parent_code) from test order by a.code – nim

相關問題