1. 程式人生 > >[Err] 1093 - You can't specify target table 's1_test' for update in FROM clause

[Err] 1093 - You can't specify target table 's1_test' for update in FROM clause

前提說明:資料庫採用的是mysql。
資料庫表格:
這裡寫圖片描述
題目:
刪除除了編號不同,其他資訊都相同的冗餘資訊。
思路:
1.找出除了編號不同,其他資訊不全相同的編號。
關鍵詞:group by……having :分組查詢,我對這個關鍵詞的理解是:不同的行之間找出列相同的一項或者幾項,幾項都需要相同用逗號隔開。查詢的幾行值中如果還需要條件過濾,那麼需要用having來過濾。
sql語句如下:
select min(編號) from s2_test group by 學號,姓名,課程編號,課程名稱,分數
2.從總表中刪除資訊不在第一步查詢中得到的編號的資料
delete from s2_test where 編號 not in
(select min(編號) from s2_test group by 學號,姓名,課程編號,課程名稱,分數)

寫到這裡,sql語句看似寫的完美,但是在mysql中執行時,會出現這個錯誤:
這裡寫圖片描述
這個錯誤的原因是:更新這個表的同時又查詢了這個表,查詢這個表的同時又去更新這個表,可以理解為死鎖,所以出現了這個問題。

解決方法:
在第一步中查詢最小的編號時,不從主表中去查詢,而是根據需要的欄位從構建一個第三個表,,從第三個表中去獲取資料。
1.構建第三張表:
select 編號, 學號,姓名,課程編號,課程名稱,分數 from s2_test as s1
2.從第三張表中查詢資料
select min(編號) as 編號 from
(select 編號, 學號,姓名,課程編號,課程名稱,分數 from s2_test) as s1
GROUP BY s1.學號,s1.姓名,s1.課程編號,s1.分數
3.從總表中刪除資訊不在第二步查詢中得到的編號的資料
DELETE from s2_test where 編號 not in
(select min(編號) as 編號 from
(select 編號, 學號,姓名,課程編號,課程名稱,分數 from s2_test) as s1
GROUP BY s1.學號,s1.姓名,s1.課程編號,s1.分數)