2009-10-22 80 views
1

我有一個表中的SQL Server 2000與類似於以下數據:選擇在SQL Server中優先

ReferenceNumber ReferenceValue 
00001    Not assigned 
00002    Not assigned 
00002    ABCDE 

,其中每個ReferenceNumber可以在表中出現多次,無論是與「不是一個ReferenceValue分配'或一個真實的ReferenceValue。

我想將數據轉儲到清理過的表中,每個ReferenceNumber只有一行,如果存在則返回一個真正的ReferenceValue;如果沒有真正的ReferenceValues,則拋棄'未分配'。

我可以看到如何使用兩個查詢做到這一點:

SELECT TOP 1 ReferenceNumber, ReferenceValue 
INTO clean 
FROM duplicates 
WHERE ReferenceValue <> 'Not assigned' 

INSERT INTO clean(ReferenceNumber, ReferenceValue) 
SELECT TOP 1 ReferenceNumber, ReferenceValue 
WHERE ReferenceValue = 'Not assigned' 
AND ReferenceNumber NOT IN (SELECT ReferenceNumber FROM clean) 

但我想一定有更好的辦法。有任何想法嗎?

回答

2

事情是這樣的:

SELECT 
    ReferenceNumber 
, ReferenceValue = ISNULL(MAX(NULLIF(ReferenceValue,'Not assigned')),'Not assigned') 
INTO Table1_Clean 
FROM Table1 
GROUP BY 
    ReferenceNumber 

MAX()忽略NULL值,所以轉換任何你不想第一個爲NULL,則MAX(),再轉換回空值到一個虛擬值。

一次通過,在線,不能得到更有效率。

2

對於SQL SERVER 2000,這可能是最簡單的。第一個子句=「真實」的值,第二個子句在第一個子句中找不到。和你的想法的延伸。

SELECT d2.ReferenceNumber, d2.ReferenceValue 
FROM duplicates d2 
WHERE d2.ReferenceValue <> 'Not assigned' 
UNION ALL 
SELECT d1.ReferenceNumber, d1.ReferenceValue 
FROM duplicates d1 
WHERE NOT EXISTS (SELECT * 
     FROM duplicates d2 
     WHERE d2.ReferenceNumber = d1.ReferenceNumber AND 
       d2.ReferenceValue <> 'Not assigned') 

但是,您想要在「真實」參考值之間打破什麼標準?或只是選擇一個?

+0

對於此特定問題,ReferenceNumber將具有「未分配」或具有唯一的ReferenceValue,因此關係沒有問題。 – taserian 2009-10-22 19:39:42

+0

@taserian:刪除我的集合 – gbn 2009-10-22 19:42:28

+0

我保留了集合,因爲即使RefNumber可以有一個真實的RefValue,RefNumber-RefValue對可以在表中多次出現。 – taserian 2009-10-22 19:57:57