-1

SQL 2008 R2 を使用しています。5 つの複合主キーがあります

(NOID ,CODE_CLIENT,CODE_DEST,DATE_CLOTURE,DATE_CLOTUR_REEL) 

私のテーブルの上。

次の構文で double を削除しようとします。

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 を追加しました。主キーの値を null にすることはできないため、値getdate()をこのキーに入れます。そのため、二重であるため、5つすべてを複合主キーとして設定することはできません。だから今、私のテーブルには主キーがありません。

4

2 に答える 2

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
于 2013-03-18T11:20:11.337 に答える
0

問題は、exists ステートメントのサブクエリが「delete from」にバインドされていないことです。その結果、ANY double が存在すると、テーブル内のすべてのレコードが削除されます。その上、主キーで何かを台無しにしたと思います(他のユーザーがコメントしたように)。とにかく、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
于 2013-03-18T11:05:18.263 に答える