根据两个字段删除重复项

时间:2014-10-29 20:09:43

标签: sql oracle

我有一个包含14列的表格,可以称为column_1 - column_14。我需要一个在两个字段组合上唯一的表(即column_1和column_2)。我不能在这个表中有任何实例,其中有多行在column_1和2中包含相同的信息。为了清楚地理解我的意思,我引用了这篇文章来确定我所说的重复项。

我引用了this post

现在,我需要学习如何从我的表中删除这些行,所以我留下了基于第1列和第1列的完全唯一的行。 2。

谢谢

3 个答案:

答案 0 :(得分:2)

为了找到您的副本,您可以使用以下查询

SELECT * FROM your_table
WHERE rowid not in
(SELECT MIN(rowid)
FROM your_table
GROUP BY column1, column2); //those are the columns that define which row is unique

要删除重复项

  DELETE FROM your_table
 WHERE rowid not in
 (SELECT MIN(rowid)
 FROM your_table
 GROUP BY column1, column2); //those are the columns that define  row is unique

答案 1 :(得分:1)

Oracle有一个rowid伪列,可以完全用于此目的。这意味着即使您的数据没有唯一ID,您也可以按照自己的意愿行事(这在Oracle数据库中非常常见,因为在Oracle 12之前设置自动递增主键很麻烦。)

代码如下:

DELETE FROM table t
    WHERE rowid > (SELECT min(rowid) FROM table t2 WHERE t2.col1 = t.col1 and t2.col2 = t.col2);

请注意,min(rowid)任意行。它不一定是插入两个值的第一行。

答案 2 :(得分:-1)

WITH Temp (column_1, column_2, duplicateRecCount)
AS
(
SELECT column_1, column_2, ROW_NUMBER() OVER(PARTITION by column_1, column_2 ORDER BY column_1, column_2) 
AS duplicateRecCount
FROM Your_Table
)
--Now Delete Duplicate Records
DELETE FROM Temp
WHERE duplicateRecCount > 1