2013-07-19 57 views
8

我試圖將this解決方案應用於MySQL DB中具有重複項的表中的數據。我得到這樣的錯誤:您無法在FROM子句中指定目標表'名稱'進行更新

SQL Error [1093] [HY000]: You can't specify target table 'NAME' for update in FROM clause 


DELETE NAME FROM NAME 
WHERE NAME.id NOT IN 
    (SELECT MIN(id) 
    FROM NAME GROUP BY col1, col2) 

也嘗試過分配別名 - 但沒有成功。 這個錯誤的原因是什麼? 它通常指出,SQL腳本可以產生循環過程,但在這裏我實際上沒有看到任何與此有關的 - 很顯然,DELETESELECT的兩個選擇是分離的 - 引擎必須首先執行SELECT,然後在WHERE條件中使用它爲DELETE。 所以 - 爲什麼會發生這種錯誤,我怎麼能真正重複刪除我的表? =)

+1

您的查詢看起來與您嘗試應用的解決方案的查詢完全無關。他們使用連接,而您正在使用'NOT IN'。 – eggyal

+0

@eggyal我的鏈接指向評論,而不是回答 –

+0

啊,夠公平的;我沒有注意到這一點。該評論是特定於SQL Server的。你會發現答案中給出的連接將在MySQL中工作。 – eggyal

回答

27

嘗試這可能會幫助你

DELETE FROM NAME 
WHERE NAME.id NOT IN (
        SELECT * FROM ( 
            SELECT MIN(id) FROM NAME GROUP BY col1,col2 
            ) AS p 
        ) 

Read more

+0

@GillBates檢查我更新的答案 –

+0

哇 - 非顯而易見的解決方案!有效! –

+0

你歡迎:),很好,它爲你工作! –

0

如果你想從一個表使用DELETE FROM tablename刪除記錄。你不能在這裏指定一個列。如果要從列中刪除數據,請使用UPDATE語句將列的值設置爲空或NULL。

3

From the manual
「目前,您無法從表中刪除並從子查詢中的同一個表中進行選擇。」

使用適當的數據庫引擎,或單獨運行查詢。 (保存ID的編程方式,在兩者之間。)

+0

你能舉個例子嗎? – Tarik

+1

一個合適的數據庫? PostgreSQL的。 – aib

-1

的刪除

的sintax不需要列

的名字,因爲MySQL的刪除符合條件的所有數據

4

您所查詢的是正確的,可以在其他DBMS上工作,但MySQL不允許您更新或從表中刪除,並從子查詢中的同一個表中進行選擇。它在官方DELETE文檔中有記錄。

它可能會在將來的版本中修復,但目前您的查詢不受支持。

一個簡單的解決方法是把你的子查詢的子子查詢,像echo_Me答案:

WHERE NAME.id NOT IN (SELECT * FROM (your subquery) s) 

這將迫使MySQL來創建你的子查詢結果的臨時表,因爲你實際上不是從同一張表中選擇,而是從一張臨時表中選擇,這個查詢會正常運行。但是,表演可能很差。

您通常使用連接來消除錯誤#1093。這是您的查詢中加入表格:

DELETE NAME 
FROM 
    NAME LEFT JOIN (
    SELECT col1, col2, MIN(id) min_id 
    FROM NAME 
    GROUP BY col1, col2) s 
    ON (NAME.col1, NAME.col2, NAME.id) = (s.col1, s.col2, s.min_id) 
WHERE 
    s.min_id IS NULL 

,或者你可以使用這個簡單的版本,這應該是最快的國家之一:

DELETE N1 
FROM 
    NAME N1 INNER JOIN NAME N2 
    ON 
    N1.col1=N2.COL1 
    AND N1.col2=N2.col2 
    AND N1.ID > N2.ID 

小提琴是here

相關問題