在oracle中查找表中的重复记录

时间:2014-12-26 20:45:10

标签: sql oracle11g

考虑从平面文件加载表格的场景。该表没有定义约束或索引。在加载之间的某种方式被中断,并且在一段时间之后,表再次从同一文件加载。所以这次在第一次加载时插入的记录是重复的。现在如何找到重复的行?假设表中有150列,因此每列的每个列都很繁琐

6 个答案:

答案 0 :(得分:0)

只有当所有列值匹配时,记录才真正重复。即使1列具有不同的值,它也会变得不同或唯一。如果表没有主要约束,则必须比较所有列。 另一种方法是,您可以在新临时表上执行第二次加载,并使用此临时表中的记录填充旧表,其中旧表中不存在记录。在任何情况下,您都必须比较2个表之间的所有列,以识别真正独特的记录。

您还可以考虑向表中添加主键,然后运行删除查询。 Check the accepted answer on this link

答案 1 :(得分:0)

您可以使用 ROWID 删除重复的行;

Select * FROM table_name A
 WHERE 
a.rowid > ANY (
 SELECT 
    B.rowid
 FROM 
    table_name B
 WHERE 
    A.col1 = B.col1
 AND 
    A.col2 = B.col2
    );

这是一个有用的链接: [http://www.dba-oracle.com/t_delete_duplicate_table_rows.htm

答案 2 :(得分:0)

经过测试......似乎有效...

1,我们以逗号分隔列表

获取表格列的列表
SELECT wm_concat(column_Name) 
FROM all_tab_cols 
WHERE table_name = 'TABLENAME'Select and Column_ID is not null;

将结果复制到下面的查询中,其中定义了ResultList。 调整表名'到你的桌子。

WITH CTE AS (SELECT TN.*, RowNum RN from 'TableName' TN order by ResultList), 
SELECT * FROM CTE A
 INNER JOIN CTE B using (ResultList)
 WHERE A.RN <> B.RN

以上使用natrual连接将所有表列连接到相同的表列,并且由于重复的行将具有不同的行号,结果集将列出两个违规记录。

答案 3 :(得分:0)

我在这个行的某个地方有一个代码段来删除重复:

DELETE FROM TABLE_NAME
    WHERE ROWID IN
      (SELECT ROWID FROM TABLE_NAME
       MINUS
       SELECT MIN(ROWID) FROM TABLE_NAME
       GROUP BY <column list> );

请注意,column_list列出了用于确定唯一性的列。

答案 4 :(得分:0)

Select * FROM table_name A
 WHERE 
a.rowid >  (
 SELECT 
    min (B.rowid)
 FROM 
    table_name B
 WHERE 
    A.row_id = B.row_id

    );

答案 5 :(得分:0)

假设您有一个测试表(使用平面文件移动记录的表) dummd ,它有多个列(如150,您不确定哪个列是独特的或主要的)和重复的行,以便找到你可以使用union的所有唯一记录,然后创建一个视图或新表,就像我做的那样 test1 : -

 create table test1 
 as
 select * from dummd
 union
 select * from dummd
相关问题