如何在同一个数据库表中查找重复的列值?

时间:2017-06-19 04:47:29

标签: sql oracle duplicates

在这种情况下,只有一个表。而专栏是MOBILENUMBER。这包含一些重复的数字。 例如有一些数字以' 0'开头。即09898123456和一些没有' 0' 9898123456。

在某种程度上,两者都是相同的数字。我想通过删除前导' 0'

找到那些重复的数字

该表包含近1600万条记录。我不希望db被锁定一段时间。查询应该是不应该进入无限循环,否则它是实时数据。

谢谢。

4 个答案:

答案 0 :(得分:2)

MOBILENUMBER列转换为Integer以删除前导零

Select * from
(
Select Count(1)Over(Partition by cast(MOBILENUMBER as INTEGER)) as Cnt,
       MOBILENUMBER 
From Yourtable 
) A
Where Cnt > 1

如果您将数据类型保持为INTEGER且约束为unique,则您不会在第一时间遇到此问题

我对Oracle中的锁不太确定。在Sql Server中,Select查询将只获取Shared锁,以便对象可以被另一个事务访问。

答案 1 :(得分:1)

您可以将数据标准化为前导零并匹配,例如:

select m, count(*) as dup_count from (
  select lpad(t.mobilenumber,11,'0') as m
  from mytable t
)
group by m
having count(*) > 1;

这种方法转换为数字的优点是,它不会在碰巧包含非数字数据的任何行上失败。

注意:

  1. Oracle使用非阻塞读取,您不必担心锁定
  2. 查询可能会很慢,具体取决于数据量,但它永远不会是"无限"。

答案 2 :(得分:0)

请使用它;

create table dup_table1 as
select to_number(t.MOBILENUMBER) mob_number, count(1) dup_count
  from table1 t
 group by to_number(t.MOBILENUMBER)
 having count(1)>1

答案 3 :(得分:0)

您可以使用自联接来匹配这些。使用此版本,可以使用任何前缀。如果您需要根据美国的国际前缀'0'匹配数字而非0,则只需将'+1'替换为select * from phones as p join phones as p1 on p.phone = '0' + p1.phone ,它将匹配+12345和2345。

select * from phones p
inner join phones p1
on p.phone = concat('0', p1.phone)

编辑:上一个示例适用于MS SQL。这是适合Oracle的正确版本。

{{1}}