2012-01-13 29 views
1

我想要做的是讓這幾乎確切的重複的所有記錄,除了重複不會在「名稱」的開頭有一個額外的炭自加入

這是我的SQL查詢:

select * from tags as spaced inner join tags as not_spaced on not_spaced.name = substring(spaced.name, 2); 

也是我想:

select * from tags as spaced where (select count(*) from tags as not_spaced where not_spaced.name = substring(spaced.name, 2)) > 0; 

什麼,我得到的是... SQL連接停止響應。 謝謝!

p.s.對不起,我沒有提到我唯一需要的領域是名字。所有其他領域都是微不足道的(如果有的話)。

+0

你的桌子和你使用的數據庫有多大?自連接可能非常耗時... – 2012-01-13 09:52:59

+0

它是股票的MySQL和表是21269記錄長 所以,我應該等待? – meandre 2012-01-13 09:55:24

+0

我是一個sql新手,所以你能告訴我這些查詢是錯誤構造的還是他們只是'重'? – meandre 2012-01-13 09:57:37

回答

0

如果表是非常大的,對name做出indexsubstring(name,2),使其更快

select t1.* from tags t1 
inner join tags t2 on t1.name = substring(t2.name, 2) 
+0

OP不查詢邏輯,OP正在查詢爲什麼...'SQL連接停止響應。' – MatBailie 2012-01-13 09:56:39

+0

@Dems:請閱讀他在哪裏寫的內容:「我想要做什麼......」。連接停止響應,因爲查詢時間太長,這很明顯。 – angus 2012-01-13 09:59:04

+1

@Dems我在我的答案上有一個解決方案('索引')。 – 2012-01-13 10:00:03

0

即使有一個索引,查詢需要每個記錄在spaced要針對每一個檢查記錄在tags

如果每個表格有1,000條記錄,那就是1,000,000個組合。


你可能會更好,只有兩個領域spaced.id, substring(t2.name, 2) as shortname,那麼指數的短名稱字段創建臨時表。加入該臨時表和索引表將會快得多。

+0

有21,269條記錄,它正在處理452,370,361個比較。通過索引的臨時保留表,索引將尋求21,269個索引。 – MatBailie 2012-01-13 10:00:51

0

不知道數據庫,表的索引方式,等等,它只是嘗試不同的東西,直到一個得到更好的優化...

這裏是另一個查詢,你可以嘗試:

SELECT name, count(*) c FROM (
    SELECT name FROM tags 
    UNION ALL 
    SELECT substring(name, 2) AS name FROM tags 
) AS t 
GROUP BY name 
1

嘗試是這樣的:

select所有潛在的重複場除了, name

from tags union all 

select所有潛在的重複場除了, substring(name, 2) name

from tags 

group by所有潛在的重複場包括

having count(*) > 1