2013-03-18 47 views
-1

我正在使用SQL 2008 R2。我有5個複合主鍵使用多個主鍵刪除SQL上的雙精度

(NOID ,CODE_CLIENT,CODE_DEST,DATE_CLOTURE,DATE_CLOTUR_REEL) 

在我的桌子上。

我嘗試刪除雙用這樣的語法:

DELETE 
FROM [LETTRE_VOIT_FINAL] 
WHERE EXISTS 
    (SELECT NOID , 
      CODE_CLIENT, 
      CODE_DEST, 
      DATE_CLOTURE, 
      DATE_CLOTUR_REEL 
    FROM LETTRE_VOIT_FINAL 
    GROUP BY NOID , 
       CODE_CLIENT, 
       CODE_DEST, 
       DATE_CLOTURE, 
       DATE_CLOTUR_REEL HAVING count(*) > 1) 

它刪除所有入口,好在我已經做了備份。

在我剛剛有4個複合主鍵之前,我添加了最後一個DATE_CLOTUR_REEL。因爲主鍵的值不能爲空,所以我把值getdate()放到這個鍵中。正因爲如此,我無法將全部5個設置爲複合主鍵,因爲我有兩個。 所以現在,我的桌子上沒有主鍵。

+1

這就是爲什麼做這樣的事情的時候,你應該使用事務,以便您的側傾他們如果他們沒有做到你想要的東西,那就回來。 – steoleary 2013-03-18 10:57:19

+2

您沒有四個主鍵。每個表可能有一個* single *主鍵。你*可能*有一個複合主鍵,由4個(你的文本)或5個(你的例子)列組成。 – 2013-03-18 10:58:26

+2

但是,如果你擁有一個聲明的主鍵,那麼就不應該有重複項,所以你需要清楚你的表設置是什麼(也許在你的問題中添加一個「CREATE TABLE」腳本,刪除一些不相關的列,如果需要的話),數據目前的樣子,以及你正在嘗試做什麼。 – 2013-03-18 11:00:07

回答

1

刪除重複形成的表:

;WITH cte 
    AS (SELECT ROW_NUMBER() OVER (PARTITION BY NOID ,CODE_CLIENT,CODE_DEST,DATE_CLOTURE,DATE_CLOTUR_REEL 
             ORDER BY (SELECT 0)) RN 
     FROM LETTRE_VOIT_FINAL) 
DELETE FROM cte 
WHERE RN > 1 
0

問題是存在語句中的子查詢沒有以任何方式與「刪除」綁定。結果是ANY雙重存在會刪除表中的所有記錄。此外,我認爲你弄糟了主鍵(正如其他用戶所評論的)。 無論如何,你可以使用CTE來刪除重複項:

WITH CTE (COl1,Col2, DuplicateCount) 
AS 
(
    SELECT COl1,Col2, 
     ROW_NUMBER() OVER(PARTITION BY COl1,Col2 ORDER BY Col1) AS DuplicateCount 
    FROM DuplicateRcordTable 
) 

DELETE 
FROM CTE 
WHERE DuplicateCount > 1