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