我有一个表PEOPLE,列'firstName''lastName'(varchars)和'deleted'(bit)等。
我想从此表中删除已删除属性为TRUE的条目,但前提是它们与表中另一个单独的条目共享其确切的firstName和lastName。
换句话说,从表中删除'已删除'的人,但仅限于他们是重复的。
不确定如何做到这一点,尤其不是如何快速做到这一点。感谢任何帮助。谢谢。
答案 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
答案 1 :(得分:1)
如果您的表具有唯一的主键(...将取决于设计......),那么这是需要计算条目出现次数的可行替代方法:
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
子句的一部分。
答案 2 :(得分:0)
这是一种基本的方法:
http://www.justin-cook.com/wp/2006/12/12/remove-duplicate-entries-rows-a-mysql-database-table/
基本上:
1.使用GROUP BY
创建一个新表
2.删除旧表。
3.重命名新表。