我有一个包含ID
,firstname
,lastname
,address
,email
等列的表格。
有没有办法从TABLE中删除重复的email
地址?
其他信息(来自评论):
如果有两行具有相同的email
地址,则会有一个正常firstname
和lastname
,但另一行会有'即时' firstname
。因此我可以区分它们。我只想删除名为'instant'的那个。
注意,firstname='Instant'
只有1 email
个地址的一些记录。我不想只删除一个唯一的电子邮件地址,因此我不能删除firstname='Instant'
中的所有内容。
请帮帮我。
答案 0 :(得分:8)
DELETE n1 FROM customers n1, customers n2 WHERE n1.ID > n2.ID AND n1.email = n2.email
答案 1 :(得分:4)
DELETE FROM table WHERE id NOT IN (SELECT MIN(id) FROM table GROUP BY email)
这为每封电子邮件保留了最低的第一个插入ID。
答案 2 :(得分:2)
虽然MiPnamic的答案基本上是正确的,但它并不能解决您保留哪条记录以及丢弃哪条记录(以及如何整理相关记录)的问题。简短的回答是,这不能以编程方式完成。
给出这样的查询:
SELECT email, MAX(ID), MAX(firstname), MAX(lastname), MAX(address)
FROM customers
使情况更糟 - 因为您可能会从重复行中选择混合字段。你需要做类似的事情:
SELECT csr2.*
FROM customers csr2
WHERE ID IN (
SELECT MAX(id)
FROM customers csr
GROUP BY email
);
获取一组唯一的现有行。当然,您仍然需要整理所有已处理的记录(提示 - 这是上面的查询未返回的客户表ID)。
答案 3 :(得分:0)
答案 4 :(得分:0)
我不知道这是否可以在MYSQL中使用(我还没有使用过它)...但你应该可以做类似下面的代码片段。
我建议你运行它们,以便了解是否选择了正确的数据。如果确实有效,那么您可能希望在列上创建约束。
获取所有重复的电子邮件地址:
SELECT
EMAILADDRESS, COUNT(1)
FROM
TABLE
GROUP BY EMAILADDRESS
HAVING COUNT(1) > 1
然后从中确定ID:
SELECT
ID
FROM
TABLE
WHERE
EMAILADDRESS IN (
SELECT
EMAILADDRESS
FROM
TABLE
GROUP BY EMAILADDRESS
HAVING COUNT(1) > 1
)
最后,根据上述和其他约束删除行:
DELETE
FROM
TABLE
WHERE
ID IN (
SELECT
ID
FROM
TABLE
WHERE
EMAILADDRESS IN (
SELECT
EMAILADDRESS
FROM
TABLE
GROUP BY EMAILADDRESS
HAVING COUNT(1) > 1
)
)
AND FIRSTNAME = 'Instant'
答案 5 :(得分:0)
使用上面的 forsvarir 答案去去重的另一种方法,但稍微修改一下。通过这种方式,您可以保留您选择分区的记录:
BEGIN TRAN
DELETE
FROM [TABLE]
WHERE
ID IN (
SELECT a.ID
FROM
(
SELECT ROW_NUMBER() OVER(PARTITION BY Email ORDER BY Email) [RowNum], ID, Email
FROM [TABLE]
WHERE Email IN
(
SELECT
Email
FROM
[TABLE]
GROUP BY Email
HAVING COUNT(1) > 1
)
) a
WHERE a.RowNum > 1
)
--COMMIT TRAN
--ROLLBACK TRAN