12

列に基づいて重複するレコードを削除するために、しばらく前にこの質問をしました。答えはうまくいきました:

delete from tbl
where id NOT in
(
select  min(id)
from tbl
group by sourceid
)

私は今、同じような状況にありますが、重複レコードの定義は複数の列に基づいています。上記のSQLを変更して、Col1 + Col2+Col3から連結されたものとして一意のレコードが定義されている重複レコードを識別するにはどうすればよいですか。私はこのようなことをするでしょうか?

delete from tbl
where id NOT in
(
select  min(id)
from tbl
group by col1, col2, col3
)
4

2 に答える 2

26

これにより、保持する行が表示されます。

;WITH x AS 
(
  SELECT col1, col2, col3, rn = ROW_NUMBER() OVER 
      (PARTITION BY col1, col2, col3 ORDER BY id)
  FROM dbo.tbl
)
SELECT col1, col2, col3 FROM x WHERE rn = 1;

これにより、削除する行が表示されます。

;WITH x AS 
(
  SELECT col1, col2, col3, rn = ROW_NUMBER() OVER 
      (PARTITION BY col1, col2, col3 ORDER BY id)
  FROM dbo.tbl
)
SELECT col1, col2, col3 FROM x WHERE rn > 1;

そして、上記の2つのセットが正しいことに満足したら、以下は実際にそれらを削除します。

;WITH x AS 
(
  SELECT col1, col2, col3, rn = ROW_NUMBER() OVER 
      (PARTITION BY col1, col2, col3 ORDER BY id)
  FROM dbo.tbl
)
DELETE x WHERE rn > 1;

3つのクエリすべてで、最初の6行は同一であり、CTEが変更された後の後続のクエリのみであることに注意してください。

于 2012-07-23T14:46:06.047 に答える
4

これを試してください。3列のテーブルtblAを作成しました。

CREATE TABLE tblA
(
id int IDENTITY(1, 1),
colA int, 
colB int, 
colC int
)

そして、いくつかの重複する値を追加しました。

INSERT INTO tblA VALUES (1, 2, 3)
INSERT INTO tblA VALUES (1, 2, 3)
INSERT INTO tblA VALUES (4, 5, 6)
INSERT INTO tblA VALUES (7, 8, 9)
INSERT INTO tblA VALUES (7, 8, 9)

以下のステートメントでselectをdeleteに置き換えると、複数列の削除が機能します。

SELECT MIN(Id) as id
FROM
(
SELECT COUNT(*) as aantal, a.colA, a.colB, a.colC
FROM tblA       a
INNER JOIN tblA b   ON b.ColA = a.ColA
                    AND b.ColB = a.ColB
                    AND b.ColC = a.ColC
GROUP BY a.id, a.colA, a.colB, a.colC
HAVING COUNT(*) > 1
) c
INNER JOIN tblA d ON d.ColA = c.ColA
                    AND d.ColB = c.ColB
                    AND d.ColC = c.ColC
GROUP BY d.colA, d.colB, d.colC
于 2012-11-27T08:40:24.443 に答える