如何删除sql中的重复记录?
答案 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;