在这种情况下,只有一个表。而专栏是MOBILENUMBER。这包含一些重复的数字。 例如有一些数字以' 0'开头。即09898123456和一些没有' 0' 9898123456。
在某种程度上,两者都是相同的数字。我想通过删除前导' 0'
找到那些重复的数字该表包含近1600万条记录。我不希望db被锁定一段时间。查询应该是不应该进入无限循环,否则它是实时数据。
谢谢。
答案 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;
这种方法转换为数字的优点是,它不会在碰巧包含非数字数据的任何行上失败。
注意:
答案 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}}