在这个场景中,只有一个表。列是MOBILENUMBER。这包含一些重复的数字。例如,有一些数字以'0‘开头,即09898123456,而另一些数字没有'0’9898123456。
在某种程度上,两者是相同的数字。我想通过去掉前导的'0‘来查找那些重复的数字
该表包含近1600万条记录。我不希望db被锁定一段时间。查询应该是这样的,它不应该进入无限循环,否则它是Live data。
谢谢。
发布于 2017-06-19 12:50:38
将MOBILENUMBER列转换为Integer以删除前导零
Select * from
(
Select Count(1)Over(Partition by cast(MOBILENUMBER as INTEGER)) as Cnt,
MOBILENUMBER
From Yourtable
) A
Where Cnt > 1如果您将数据类型保留为带有unique约束的INTEGER,那么您首先就不会遇到这个问题
我对Oracle中的锁不是很确定。在Sql Server中,Select查询将只获取一个Shared锁,以便另一个事务可以访问该对象。
发布于 2017-06-19 15:13:58
您可以将数据归一化,使其具有前导零,并在其上进行匹配,例如:
select m, count(*) as dup_count from (
select lpad(t.mobilenumber,11,'0') as m
from mytable t
)
group by m
having count(*) > 1;这种转换为数字的方法的优点是,它不会在包含非数字数据的任何行上失败。
备注:
发布于 2017-06-19 13:47:37
请用这个;
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)>1https://stackoverflow.com/questions/44622423
复制相似问题