2015-01-13 32 views
0

嗨,我有一個表,名爲積分這樣需要刪除所有重複的行中的數據庫如果兩個列數據在MSSQL中是相同

ID identity 
Name varchar 
CustCode varchar 
ConsignorNo varchar 
Address varchar 

但是我有這樣

ID 1 Name John CustCode A1 ConsignorNo BBS Address XXX 
ID 2 Name Mari CustCode A2 ConsignorNo NRM Address XXX 
ID 3 Name John CustCode A1 ConsignorNo BBS Address XXX 
ID 4 Name Mari CustCode A2 ConsignorNo MMS Address XXX 
整個數據庫的重複行

由於CustCode和ConsignorNo在John中是相同的,所以它必須被刪除,並且Mari不應該被刪除,因爲它包含相同的custcode但是不同的ConsignorNo。我已經嘗試過,但會拋出事務日誌已滿的錯誤。查詢是

delete from Credits 
where ID not in (select MAX(ID) 
       from Credits 
       group by ConsignerNo, CustomerCode) 
+0

是否要刪除所有或只有這麼多還有一行嗎? –

+0

只需要一行 – Ranjancode

+0

我需要額外的行將被刪除 – Ranjancode

回答

0

的一種方法,使用CTE + ROW_NUMBER

WITH CTE AS 
(
    SELECT t.*, 
      RN = ROW_NUMBER() OVER (PARTITION BY Custcode, ConsignorNo ORDER BY ID DESC) 
    FROM dbo.tableName 
) 
DELETE FROM CTE 
WHERE RN > 1 

我喜歡它,因爲它很簡單,很容易被改變,看你要刪除的內容。

上面刪除除了一行(ID最高的一行)以外的所有行。如果你想刪除所有有重複(這並不是說清楚),那麼你可以使用COUNT(*)OVER(PARTITION BY Custcode, ConsignorNo)

WITH CTE AS 
(
    SELECT t.*, 
      Count = COUNT(*) OVER (PARTITION BY Custcode, ConsignorNo) 
    FROM dbo.tableName 
) 
DELETE FROM CTE 
WHERE Count > 1 
+0

查詢在幾分鐘後顯示錯誤。錯誤是數據庫'1strackcourier_courier'的事務日誌已滿。要找出日誌中的空間不能被重用的原因,請參閱sys.databases中的log_reuse_wait_desc列 – Ranjancode

+0

@ user1862373:如果用'SELECT * FROM CTE WHERE RN> 1'替換'DELETE FROM CTE WHERE RN> 1',有多少行返回?這些是將被刪除的記錄。根據錯誤看看這裏:http://stackoverflow.com/questions/13421370/the-transaction-log-for-database-databasename-is-full也許這只是你的硬盤驅動器用完磁盤空間。事務日誌用於回滾所有更改。如果你刪除了很多記錄,你就可以創建一個大的翻譯記錄。 –

+0

謝謝。不需要刪除所有的東西。如果你給我一個沒有重複記錄的查詢,那麼它會非常好。我還需要一個關於custcode的條件。 – Ranjancode

0

嘗試一些事情是這樣的:

delete from Credits 
    where ID = (select MAX(ID) 
        from Credits 
        group by ConsignerNo, CustomerCode having count(*)>1) 
+0

希望這可以幫助你! –

+0

它拋出的錯誤是子查詢返回多個值 – Ranjancode

相關問題