我希望创建一个语句停止并返回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函数,但这似乎不是这样的
答案 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