2016-11-15 46 views
1

這裏是我的查詢:MySQL查詢與DELETE任何地方運行時間過長

DELETE FROM my_table WHERE name = ANY (
SELECT name FROM (
    SELECT sd1.name 
    FROM my_table sd1 JOIN my_table sd2 
    ON sd2.name > sd1.name 
    AND sd2.name & sd1.name = sd1.name 
    AND sd1.number >= sd2.number) AS stmp 
); 

名是主鍵BIGINT類型。

即使my_table中沒有太多行,也需要很長時間才能運行。 關於如何使其運行更快的任何想法。

+0

你使用什麼數據類型作爲'name'? –

+0

另外我忘了提及這個名字是my_table的主鍵 – Pol99

+0

如果您忘記了某些東西,您可以編輯您的問題。 –

回答

1

您正在尋找sd1.names,其中存在具有特定條件的其他記錄。然後你刪除所有找到的名字的記錄。

是不是這麼簡單:刪除其中存在具有特定標準的另一個記錄的記錄?

DELETE FROM my_table 
WHERE EXISTS 
(
    SELECT * 
    FROM 
    (
    SELECT * 
    FROM my_table sd2 
    WHERE sd2.name > my_table.name 
    AND sd2.name & my_table.name = my_table.name 
    AND my_table.number >= sd2.number 
) dummy 
); 

更新: MySQL不能訪問同一個表中UPDATEDELETE和一個必須換子查詢這樣的表被那種隱藏的隱藏的更深一層看起來絕對毫無意義的,但應該解決這個問題問題。希望它能。)

這並不複雜,因此可能會更快。特別是因爲EXISTS必須爲每個主要記錄找到一個匹配項,並且可以在那裏停止,而連接查找所有匹配項。

+0

嗯,它給了我語法錯誤: 的MySQL> DELETE FROM MY_TABLE SD1 WHERE EXISTS ( SELECT * FROM SD2 MY_TABLE WHERE sd2.name> sd1.name AND sd2.name&sd1.name = sd1.name AND sd1.number> = SD2。號碼 ); 錯誤1064(42000):您的SQL語法錯誤;檢查 對應於你的MySQL服務器版本 'SD1 WHERE EXISTS ( SELECT * FROM SD2 MY_TABLE WHERE sd2.name> sd1.name ' 在行1 – Pol99

+0

我不得不用接近正確的語法手冊谷歌這個。MySQL不接受任何原因的表別名(他們提供了別名的奇怪的語法,但我們可以輕鬆地在這裏沒有。)請看我更新的答案。 –

+0

我一直使用MySQL別名。當我按照您的建議運行查詢時出現以下錯誤信息: 錯誤1093(HY000):您無法在FROM子句 – Pol99