2012-09-12 28 views
1

我有一個問題,這是討厭我的地獄!SQL重複 - 沒有找到他們全部

我有一個擁有數千用戶的數據庫。數據最初來自我無法信任數據的數據庫,因此我已將其導入另一個「清理」數據庫以刪除重複條目。

我執行查詢:

SELECT uid, username 
FROM users 
GROUP BY username 
HAVING COUNT(username)>1 

這是我的表在其當前狀態的樣品:

uid  forename  surname  username 
1  Jo   Bloggs  jobloggs 
2  Jo   Bloggs  jobloggs 
3  Jane   Doe   janedoe 
4  Jane   Doe   janedoe 

執行上面的查詢後,我得到了下面的示例結果:

uid  forename  surname  username 
2  Jo   Bloggs  jobloggs 

正如你所看到的,有2個重複的用戶,但是查詢只顯示o這些。

當我執行查詢時,我得到300〜結果。很明顯,如果查詢不是拉取所有重複項,我不能相信這個結果集是準確的,不能繼續清理。

任何想法是關於我可以嘗試?

感謝

菲爾

+0

任何想法,如果說之前還有空間/用戶名數據 –

+0

不,沒有空格,值插入數據庫:( –

+1

您正在使用什麼版本的SQL之前修剪?以後你上面的例子似乎工作中[SQL Fiddle](http://sqlfiddle.com/#!2/9103f/1)。遠景也是如此,但是在你的查詢中聲明瞭一個「LIMIT」(例如,PHPMyAdmin在你運行你的SQL後添加了一個) )? –

回答

0

有對正在返回的ResultSet沒有很好的解釋。

根據樣本數據,和您的查詢,那麼你應該得到一個第二排:

3 janedoe 

(實際上,不管你得到的3或4 UID返回值是任意)

此外,請確保您的客戶端只返回行的子集,例如SQLyog具有限制返回行數的「限制行數」功能。

如果這不是問題,那麼最可能的解釋是其中一個'janedoe'包含非打印字符,或者當兩個不同的編碼顯示相同的值時,您會發生一些惡意的字符集轉換。

作爲一個快速的第一步,我建議你檢查的字符數在每個那些「janedoe」值:

SELECT username, LENGTH(username) FROM mytable WHERE uid IN (3,4) ORDER BY uid 

此外,您還可以嘗試顯示實際編碼,使用HEX( )函數來查看是否有區別。 (注意:我不清楚在HEX之前或之後是否會發生一個字符集轉換,我們在這裏後面是Oracle DUMP()函數的等價物,它將顯示實際值的逐字節表示。 )

這可能是因爲你有一些Latin1編碼變成了UTF-8,反之亦然,或者其他一些字符集怪異在進行。這可能會給你一些想法...

​​