我正在寻找创建一条语句,该语句将在列上找到重复值的第二秒停止并返回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函数,但这似乎并非如此。
您将使用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;
如果没有返回任何行,则没有重复项。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句