0

奇妙な質問があります。会社の SQL データベースに不要な値が追加されました。私のSQLテーブルから削除する方法。

columnA   ColumnB   ColumnC   ColumnD   ColumnE 
   1         22      3332
   2         11      5543
   3         11      4444
   4         11      1234
   4         11      1344
   4         11      5666

それは違いない

columnA   ColumnB   ColumnC  ColumnD   ColumnE 
   1        22       3332
   2        11       5543
   3        11       4444
   4        11       1234
4

3 に答える 3

4

最後の 2 行を削除しようとしているのでしょうか。削除したい条件に一致する削除ステートメントを作成するだけです (既存のデータを複製していないように見えるため)。

DELETE FROM MyTable
WHERE ColumnA = 4 
AND ColumnB = 11 
AND ColumnC = 1344

DELETE FROM MyTable
WHERE ColumnA = 4 
AND ColumnB = 11 
AND ColumnC = 5666

(もちろん、「MyTable」を、提供していないテーブルの実際の名前に置き換えます)。

于 2013-02-15T16:30:39.917 に答える
4

CTEとROW_NUMBER関数を使用

WITH CTE AS
(
    SELECT columnA, ColumnB, ColumnC, ColumnD, ColumnE,
        RN = ROW_NUMBER()OVER(PARTITION BY columnA, ColumnB ORDER BY ColumnC)
   FROM dbo.TableName
)
DELETE FROM CTE WHERE RN > 1

これは、重複が最初の 2 つの列によって決定されColumnC、サンプルのように最小値でそれを保持することを前提としています。

ここにデモがあります。

于 2013-02-15T16:31:24.077 に答える
1

どの記録を保持したいのかわからないため、ご質問にお答えするのは困難です。最初の 2 列でグループ化された最初のレコードを保持したい場合、これは近いですが、保証はされません。

WITH CTE AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY col1,col2 ORDER BY (SELECT NULL)) RN
FROM YourTable
  ) 
DELETE FROM CTE WHERE RN<>1

別のフィールドがある場合 (Tim Schmelter の回答など)、SELECT NULL の代わりにそれを使用します。

ここに何が残るかを示すフィドルがあります:http://sqlfiddle.com/#!3/29aec/4

于 2013-02-15T16:36:46.027 に答える