首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在同一数据库表中查找重复的列值?

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

Stack Overflow用户
提问于 2017-06-19 12:47:29
回答 4查看 589关注 0票数 2

在这个场景中,只有一个表。列是MOBILENUMBER。这包含一些重复的数字。例如,有一些数字以'0‘开头,即09898123456,而另一些数字没有'0’9898123456。

在某种程度上,两者是相同的数字。我想通过去掉前导的'0‘来查找那些重复的数字

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

谢谢。

EN

回答 4

Stack Overflow用户

发布于 2017-06-19 12:50:38

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

代码语言:javascript
复制
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锁,以便另一个事务可以访问该对象。

票数 2
EN

Stack Overflow用户

发布于 2017-06-19 15:13:58

您可以将数据归一化,使其具有前导零,并在其上进行匹配,例如:

代码语言:javascript
复制
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. 根据数据量的不同,查询可能会很慢,但它永远不会是“无限的”。
票数 1
EN

Stack Overflow用户

发布于 2017-06-19 13:47:37

请用这个;

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44622423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档