MySQL-去重留一


問題:

  去除MySQL中重復的記錄,僅保留其中一條。本例中cname為重復項,而cid為primary key。

嘗試解決:

  使用代碼:

DELETE FROM t_customer
WHERE cname in
    (
    SELECT cname FROM t_customer GROUP BY cname HAVING count(cname)>1
    )
AND cid NOT IN
    (
    SELECT min(cid) cid FROM t_customer GROUP BY cname HAVING count(cname)>1
    )

  代碼思路:

    設置2個條件,1是查出cname相同的記錄里的cname值,2是查出cname相同的記錄里cid最小的一項記錄的cid值,然后據此進行刪除cname重復的記錄,保留其中cid最小的記錄。

  運行以后發現:

    報錯:[HY000][1093] You can't specify target table 't_customer' for update in FROM clause
    報錯原因:(找了幾篇博客看來的)大意是:不能在同一條語句中對某個字段進行判斷的同時,又對其進行update操作。有博主還提到“這個問題只出現於MySQL,MSSQL和Oracle不會出現此問題”(未驗證過,在此只是提一句)

最后解決:

  1種代碼:

DELETE FROM t_customer
WHERE cname in
    (
    SELECT cname FROM
                      (
                      SELECT cname FROM t_customer GROUP BY cname HAVING count(cname)>1
                      ) t1
    )
AND cid NOT IN
    (
    SELECT cid FROM
                    (
                    SELECT min(cid) cid FROM t_customer GROUP BY cname HAVING count(cname)>1
                    ) t2
    )

   思路:

    將之前的2個查詢結果先暫存為t1和t2,然后從這2個臨時集合中查詢出cname和cid作為刪除條件

  第2中代碼:

    看其他的博客看到的:

DELETE t_customer
FROM
     t_customer,
     (
     SELECT min(cid) cid, cname
     FROM t_customer
     GROUP BY cname
     HAVING count(cname)>1
     )t
WHERE t_customer.cname=t.cname
AND t_customer.cid>t.cid;

     運行以后也得到了想要的結果。

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM