如何在SQL中删除重复记录
如何在sql中删除重复记录?以下是如何在Oracle中使用ROWID执行此操作。不同口味的RDBMS将有自己的等价物 我从创建一些重复记录开始如何在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> 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他说删除重复项,而不仅仅是避免选择它们。