2011-06-27 144 views
1

我有一個表PEOPLE,列'firstName''lastName'(varchars)和'刪除'(位)等。MySQL DELETE查詢條件

我想從此表中刪除具有屬性TRUE以便刪除的條目,但只有當它們與表中的另一個單獨條目共享其確切的firstName和lastName時纔有效。

換句話說,從表中刪除'刪除'的人,但只有當他們是重複的。

不知道如何做到這一點,特別是如何快速做到這一點。任何幫助表示讚賞,謝謝。

+0

你怎麼知道哪個是重複的,哪個是主要記錄? –

+0

可能重複[數據庫中的重複條目](http://stackoverflow.com/questions/5970329/duplicate-entries-in-db) – Neal

+0

所有字段在同一個表中? –

回答

1
DELETE FROM people 
WHERE EXISTS (
    SELECT * 
    FROM people p2 
    WHERE people.firstName = p2.firstName AND people.lastName = p2.lastName 
    GROUP BY firstName, lastName 
    HAVING COUNT(*)>1 
) 
AND deleted = 1 -- True 
+0

你需要嵌套語句中的where子句嗎? – Dirk

+0

是的,加入與外表的子查詢。 – niktrs

+0

@niktrs,這將需要一個loooong時間是表是巨大的。 – Neal

1

如果你的表中有一個唯一的主鍵(...取決於設計......),那麼這就是需要計算的條目occurrances一個可行的替代方案:

DELETE FROM people as A 
WHERE deleted = 1 
AND EXISTS (SELECT '1' 
      FROM people as B 
      WHERE B.id <> A.id 
      AND A.firstName = B.firstName 
      AND A.lastName = B.lastName) 

這可能比計數行稍好一些。請注意,這個查詢可能會遇到前一個答案中可能出現的相同問題;具體來說,如果有兩個或更多'已刪除'行,並且沒有'未刪除',他們兩個都可能會被刪除(沒有行!)。如果查詢的意圖只是在存在「未刪除」等效行時刪除「已刪除」行,請將AND B.deleted = 0作爲內部WHERE子句的一部分添加。

+0

太好了 - 這個可以讓我很容易'AND B.deleted = 0'解決,我懷疑提問者想要的,而另一個則不需要。 –

+0

建議:使用A.id> B.id,因此所有比第一條記錄新的都將被刪除。也執行得更快。 – niktrs

+0

@niktrs - 不幸的是,這假定只有後來(或更早)的id被「刪除」。根據設計和使用情況,這個假設可能有效也可能不會有效。但是,是的,否則,這可能會表現更好。 –