如何在SQL中删除重复记录

如何在SQL中删除重复记录,sql,Sql,如何在sql中删除重复记录?以下是如何在Oracle中使用ROWID执行此操作。不同口味的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

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

以下是如何在Oracle中使用ROWID执行此操作。不同口味的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>
请注意,在子查询中,必须包含尽可能多的列,以指定构成唯一性的内容。这可能会成为全部记录,尽管人们希望不会

顺便说一句,实现这一点的最有效方法是首先不要有重复的记录。这就是大自然给我们主键和唯一约束的原因。

从表中选择列


从表中选择不同的列

由于假设行是100%重复的,表上没有键,因此其他表使用外键引用表时不会出现任何问题

最快、最简单的方法是:

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);
在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

在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号或主键。

在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,并删除具有最大行项的ID

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

在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); 

你怎么知道它们是复制品?你是怎么得到复制品的?您没有任何唯一性约束吗?PK怎么样?您对重复的定义是什么?发布表和数据示例。为了让您免于疑虑,我假设您已经设置了主键,但数据的性质允许重复,例如名称表。但是,根据数据的不同,您可以使用不同的技术来查找重复项。所以,我们首先需要的是表的结构,包括主键和约束,以及包括你认为是复制品的数据类型。没想到这会被允许。。。但是你瞧,它是有效的+1他说删除重复项,而不仅仅是避免选择它们。