2015-08-27 59 views
1

我最近問this question關於如何查詢數據庫中的重複行。我收到的答案很奏效,但速度更快,但我已將數據集從20,000行擴展到80,000行,並且查詢所用的時間在幾分鐘內,這是不可接受的。使用休眠與大數據集重複行

如果我有這樣的一個表:

ID Name Country 
1  Dave UK 
2  Jim  UK 
3  Dave UK 
4  Dave US 
5  Jim  US 

我希望能夠返回行1和3,因爲他們是在那裏的名字和國家的組合多次出現的唯一行。

目前的答案是做到以下幾點:

select r 
from Runner r 
where exists 
(
    select rn 
    from Runner rn 
    where rn.id <> r.id 
    and rn.name = r.name 
    and rn.country = r.country 
) 

但這服用時間太長了。我想知道是否有人能夠優化此查詢以便在比較中更高效,或者是否有任何可顯着提高查詢性能的策略?

回答

0

它不需要是子查詢。

如何以下查詢

select name, country, count(1) from Runner group by name, country having count(1) > 1

根據修訂的需求,你可以使用這個:

select * 
from Runner r1 
inner join ( 
    select name, country, count(1) 
    from Runner 
    group by name, country 
    having count(1) > 1) r2 on (r1.name = r2.name and r1.country = r2.country) 
where r1. name = ? 

的地方進行整體查詢子句僅是一個例子,如果你想限制結果。

+0

我嘗試了類似的東西,它拋出了一個錯誤,因爲group by子句中沒有ID。 – christopher

+0

請嘗試一下查詢瀏覽器。如果你在查詢中沒有包含id,它不需要包含在group by子句 – ajoshi

+0

是的,但是我不想只返回名字和國家。我想返回整個對象,這將隱含包含ID。 – christopher