Oracle SQL中最快的方法是找出表中是否存在一个或多个重复项?

时间:2016-10-24 12:45:28

标签: sql oracle duplicates

我希望创建一个语句停止并返回true,它会在列上找到重复值。我不在乎价值是什么,只需要知道是否存在重复;没别的。

我知道我可以写Select count(*) from myTable group by primary_id having count(*) > 1;但这会遍历表格的每一行,而我希望查询在遇到单个重复存在的情况时立即停止。

我所知道的最佳镜头是: -

 select 1 as thingy from dual outer_qry
 where exists
 (
    select * from
      (
       select some_ID, 
              case when COUNT(*) > 1 then 'X' else 'N' end as TRIG 
       from myTable 
       group by some_ID
       )INNER_QRY
       where INNER_QRY.trig = outer_qry.dummy 
 );

然而,这需要13秒,我怀疑找到第一个副本需要很长时间。

任何人都可以建议我的想法出错了,希望从我的SQL中,我的假设是,对于inner_qry返回的每一行都将检查EXISTS函数,但这似乎不是这样的

3 个答案:

答案 0 :(得分:4)

您将使用exists。这将返回所有重复项:

select t.*
from mytable t
where exists (select 1
              from mytable t t2
              where t2.some_id = t.some_id and t2.rowid <> t.rowid
             );

在Oracle 12c中,您将添加fetch first 1 row only。它可以利用mytable(some_id)上的索引。

在早期版本中:

select 1 as HasDuplicate
from (select t.*
      from mytable t
      where exists (select 1
                    from mytable t t2
                    where t2.some_id = t.some_id and t2.rowid <> t.rowid
                   )
     ) t
where rownum = 1;

如果没有返回任何行,则没有重复项。

答案 1 :(得分:1)

select * from table1 t1 natural join table1 t2 where t1.rowid < t2.rowid;

答案 2 :(得分:0)

您可以使用它来了解哪个id是dublicate

   select some_ID 
   from myTable 
   group by some_ID having count(*) >1