因爲你正在使用SQL Server 2000,而你卻被無法使用排過建立一個序列的技術並確定每個唯一ID的頂部行。
所以,你提出的技術是使用一個日期時間列來得到最高的1行來刪除重複。這可能會起作用,但有可能您仍可能獲得具有相同日期時間值的副本。但這很容易檢查。
首先檢查的假設,所有的行根據id和日期欄,獨特:
CREATE TABLE #TestTable (rowid INT IDENTITY(1,1), thisid INT, thisdate DATETIME)
INSERT INTO #TestTable (thisid,thisdate) VALUES (1, '11/11/2009')
INSERT INTO #TestTable (thisid,thisdate) VALUES (1, '12/11/2009')
INSERT INTO #TestTable (thisid,thisdate) VALUES (1, '12/12/2009')
INSERT INTO #TestTable (thisid,thisdate) VALUES (2, '1/11/2009')
INSERT INTO #TestTable (thisid,thisdate) VALUES (2, '1/11/2009')
SELECT COUNT(*) AS thiscount
FROM #TestTable
GROUP BY thisid, thisdate
HAVING COUNT(*) > 1
此示例返回的值是2 - 即使使用日期後,表明你仍然會結束與重複列以刪除重複項。如果你返回0,那麼你已經證明了你提出的技術是可行的。
在對生產數據進行去重處理時,我認爲應該採取一些預防措施並在測試前後進行測試。您應該創建一個表來保存您計劃刪除的行,以便在執行delete語句後您可以輕鬆恢復它們。
此外,最好事先知道您計劃刪除多少行,以便您可以驗證前後的計數 - 並且您可以評估刪除操作的大小。根據有多少行受到影響,您可以計劃何時運行該操作。
要在重複掃描過程之前進行測試,請查找事件。
-- Get occurrences of duplicates
SELECT COUNT(*) AS thiscount
FROM
#TestTable
GROUP BY thisid
HAVING COUNT(*) > 1
ORDER BY thisid
這爲您提供具有相同ID的多行的行。將此查詢中的行捕獲到臨時表中,然後使用SUM運行查詢以根據您的密鑰獲取不唯一的行數。
要獲得您計劃刪除的行數,您需要根據您的唯一密鑰重複的行數以及基於唯一密鑰的不同行數。您從出現次數中減去不同的行。所有這些都很簡單 - 所以我會留給你的。
你說刪除重複項,但顯然你刪除了最小值和最大值之間的所有日期 - 你能澄清一下嗎? – Amarghosh 2009-11-23 12:52:11