497

存在しない重複行を削除するにはどうすればよいunique row idですか?

私のテーブルは

col1  col2 col3 col4 col5 col6 col7
john  1    1    1    1    1    1 
john  1    1    1    1    1    1
sally 2    2    2    2    2    2
sally 2    2    2    2    2    2

重複を削除した後、次のものを残したい:

john  1    1    1    1    1    1
sally 2    2    2    2    2    2

いくつかのクエリを試しましたが、目的の結果が得られないため、行 ID に依存していると思います。例えば:

DELETE
FROM table
WHERE col1 IN (
    SELECT id
    FROM table
    GROUP BY id
    HAVING (COUNT(col1) > 1)
)
4

23 に答える 23

886

私はCTEが好きでROW_NUMBER、2つを組み合わせると、削除(または更新)された行を確認できるため、次のように変更するだけDELETE FROM CTE...ですSELECT * FROM CTE

WITH CTE AS(
   SELECT [col1], [col2], [col3], [col4], [col5], [col6], [col7],
       RN = ROW_NUMBER()OVER(PARTITION BY col1 ORDER BY col1)
   FROM dbo.Table1
)
DELETE FROM CTE WHERE RN > 1

DEMO (結果は異なります。あなたのタイプミスによるものだと思います)

COL1    COL2    COL3    COL4    COL5    COL6    COL7
john    1        1       1       1       1       1
sally   2        2       2       2       2       2

この例col1では、PARTITION BY col1. 複数の列を含めたい場合は、それらを に追加するだけですPARTITION BY

ROW_NUMBER()OVER(PARTITION BY Col1, Col2, ... ORDER BY OrderColumn)
于 2013-08-22T20:55:50.640 に答える
70

CTE使用せずROW_NUMBER()に、 group byMAX関数を使用するだけでレコードを削除できます ここに例があります

DELETE
FROM MyDuplicateTable
WHERE ID NOT IN
(
SELECT MAX(ID)
FROM MyDuplicateTable
GROUP BY DuplicateColumn1, DuplicateColumn2, DuplicateColumn3)
于 2016-10-30T07:22:57.113 に答える
18
DELETE from search
where id not in (
   select min(id) from search
   group by url
   having count(*)=1

   union

   SELECT min(id) FROM search
   group by url
   having count(*) > 1
)
于 2014-08-11T14:55:13.623 に答える
7

これは、SQL Server でさまざまな方法で実行できます。最も簡単な方法は、重複行テーブルから新しい一時テーブルに個別の行を挿入することです。次に、重複行テーブルからすべてのデータを削除し、以下に示すように、重複のない一時テーブルからすべてのデータを挿入します。

select distinct * into #tmp From table
   delete from table
   insert into table
   select * from #tmp drop table #tmp

   select * from table

共通テーブル式 (CTE) を使用して重複行を削除する

With CTE_Duplicates as 
(select id,name , row_number() 
over(partition by id,name order by id,name ) rownumber  from table  ) 
delete from CTE_Duplicates where rownumber!=1
于 2019-07-19T16:25:17.283 に答える
1
with myCTE
as

(
select productName,ROW_NUMBER() over(PARTITION BY productName order by slno) as Duplicate from productDetails
)
Delete from myCTE where Duplicate>1
于 2016-10-09T18:41:20.933 に答える