如何在SQL中删除重复记录

时间:2010-02-03 12:36:31

标签: sql

如何删除sql中的重复记录?

7 个答案:

答案 0 :(得分:7)

SQL Server 2005及以上:

WITH    q AS
        (
        SELECT  *, ROW_NUMBER() OVER (PARTITION BY dup_column ORDER BY dup_column) AS rn
        FROM    mytable
        )
DELETE
FROM    q
WHERE   rn > 1

答案 1 :(得分:4)

以下是使用ROWID在Oracle中执行此操作的方法。不同风格的RDBMS都有自己的等价物。

我首先创建一些重复的记录......

SQL> select t, count(*) from t23 group by t;

T       COUNT(*)
----- ----------
09:00          2
12:00          2
10:30          2
11:00          2
12:30          2
08:00          2
10:45          2
11:15          2

8 rows selected.

SQL>

...现在我使用T来定义“重复记录”......

SQL> delete from t23
  2  where rowid > ( select min(rowid) from t23 x
  3                  where x.t = t23.t )
  4  /

8 rows deleted.

SQL> select t, count(*) from t23 group by t;

T       COUNT(*)
----- ----------
09:00          1
12:00          1
10:30          1
11:00          1
12:30          1
08:00          1
10:45          1
11:15          1

8 rows selected.

SQL>

请注意,在子查询中,您必须包含尽可能多的列以指定构成uniquenss的内容。这可能最终成为整个记录,尽管人们不希望如此。

顺便提一下,最有效的方法是首先不要有重复的记录。这就是为什么大自然给了我们主键和独特的约束。

答案 2 :(得分:3)

由于表中没有密钥(假设您的行是100%重复的),因此使用FOREIGN KEY引用表的其他表不会有任何问题。

这样做最快,最简单的方法是:

SELECT DISTINCT *
INTO #tmp
FROM YourTable;

TRUNCATE TABLE YourTable;

INSERT YourTable
SELECT * from #tmp;

也许考虑在最后添加这个语句的某个版本; - )

ALTER YourTable ADD CONSTRAINT PK_YourTable PRIMARY KEY (whatever, keeps, this, from, happening, again);

答案 3 :(得分:0)

在Postgresql中,我使用以下内容:

DELETE FROM table_name q
WHERE EXISTS (
   SELECT 1
   FROM   table_name q1
   WHERE  q1.ctid < q.ctid
   AND    q.fid = q1.fid
   );

fid是您唯一的ID号或主键。

答案 4 :(得分:0)

在MS SQL中,

DELETE Table1 FROM Table1 
INNER JOIN ( 
   SELECT MAX(lineitem) AS lineitem, ID, COUNT (ID) AS IDCount 
   FROM Table1 
   GROUP BY ID HAVING COUNT (ID) > 1) AS Table2 
ON Table1.ID = Table2.ID and Table1.LineItem = Table2.lineitem

上面的SQL将找到所有重复的ID并删除具有最大LineItem的那个。

ID         LineItem
---        --------
111        1
111        2 (Deleted)
222        1
222        2 (Deleted)

答案 5 :(得分:0)

在Oracle中,我们可以通过多种方式实现它。

1)通过创建新表:

create table emp2 as
select distinct * from EMP;
drop table emp;
alter table emp2 rename to emp; 

2)使用RowID:

delete from EMP where rowid not in (
select max(rowid) from EMP group by EMPNO, EMPNAME, SALARY); 

3)使用自我加入和RowID:

delete from emp e1 where rowid not in(
select max(rowid) from EMP e2
where e1.EMPNO = e2.EMPNO); 

答案 6 :(得分:-2)

从表中选择col;

从表中选择不同 col;