1. 程式人生 > >MySQL中刪除重複資料只保留一條

MySQL中刪除重複資料只保留一條

用SQL語句,刪除掉重複項只保留一條

在幾千條記錄裡,存在著些相同的記錄,如何能用SQL語句,刪除掉重複的呢  1、查詢表中多餘的重複記錄,重複記錄是根據單個欄位(peopleId)來判斷

SELECT
    *
FROM
    people
WHERE
    peopleId IN (
        SELECT
            peopleId
        FROM
            people
        GROUP BY
            peopleId
        HAVING
            count(peopleId) > 1
    )

2、刪除表中多餘的重複記錄,重複記錄是根據單個欄位(peopleId)來判斷,只留有rowid最小的記錄

DELETE
FROM
    people
WHERE
    peopleName IN (
        SELECT
            peopleName
        FROM
            people
        GROUP BY
            peopleName
        HAVING
            count(peopleName) > 1
    )
AND peopleId NOT IN (
    SELECT
        min(peopleId)
    FROM
        people
    GROUP BY
        peopleName
    HAVING
        count(peopleName) > 1
)

3、查詢表中多餘的重複記錄(多個欄位)

SELECT
    *
FROM
    vitae a
WHERE
    (a.peopleId, a.seq) IN (
        SELECT
            peopleId,
            seq
        FROM
            vitae
        GROUP BY
            peopleId,
            seq
        HAVING
            count(*) > 1
    )

4、刪除表中多餘的重複記錄(多個欄位),只留有rowid最小的記錄

DELETE
FROM
    vitae a
WHERE
    (a.peopleId, a.seq) IN (
        SELECT
            peopleId,
            seq
        FROM
            vitae
        GROUP BY
            peopleId,
            seq
        HAVING
            count(*) > 1
    )
AND rowid NOT IN (
    SELECT
        min(rowid)
    FROM
        vitae
    GROUP BY
        peopleId,
        seq
    HAVING
        count(*) > 1
)

5、查詢表中多餘的重複記錄(多個欄位),不包含rowid最小的記錄

SELECT
    *
FROM
    vitae a
WHERE
    (a.peopleId, a.seq) IN (
        SELECT
            peopleId,
            seq
        FROM
            vitae
        GROUP BY
            peopleId,
            seq
        HAVING
            count(*) > 1
    )
AND rowid NOT IN (
    SELECT
        min(rowid)
    FROM
        vitae
    GROUP BY
        peopleId,
        seq
    HAVING
        count(*) > 1
)

6.消除一個欄位的左邊的第一位:



UPDATE tableName
SET [ Title ]= RIGHT ([ Title ],(len([ Title ]) - 1))
WHERE
    Title LIKE '村%'

7.消除一個欄位的右邊的第一位:



UPDATE tableName
SET [ Title ]= LEFT ([ Title ],(len([ Title ]) - 1))
WHERE
    Title LIKE '%村'

8.假刪除表中多餘的重複記錄(多個欄位),不包含rowid最小的記錄

UPDATE vitae
SET ispass =- 1
WHERE
    peopleId IN (
        SELECT
            peopleId
        FROM
            vitae
        GROUP BY
            peopleId

可能會遇到You can't specify target table '表名' for update in FROM clause這樣的錯誤,它的意思是說,不能先select出同一表中的某些值,再update這個表(在同一語句中),即不能依據某欄位值做判斷再來更新某欄位的值。

1、資料準備

product表資料如下:

laptop表資料如下:

2、要求:#刪除所有不生產印表機廠商生產的膝上型電腦

第一步:對aptop表進行操作

操作沒有問題,按照本思路對product表進行操作

產生You can't specify target table '表名' for update in FROM clause錯誤

3、問題解決

將SELECT出的結果再通過中間表SELECT一遍,這樣就規避了錯誤。

需要注意的是,這個問題只出現於MySQL,MSSQL和Oracle不會出現此問題。