由于您使用 id 列作为哪个记录是“原始”的指示符:
delete x
from myTable x
join myTable z on x.subscriberEmail = z.subscriberEmail
where x.id > z.id
这将为每个电子邮件地址留下一条记录。
编辑添加:
为了解释上面的查询...
这里的想法是将表与表本身连接起来。假设您有该表的两个副本,每个副本的名称都不同。然后您可以将它们相互比较,并找到每个电子邮件地址的最低 ID。然后,您会看到稍后创建的重复记录,并且可以将其删除。 (当我思考这个问题时,我正在想象 Excel。)
为了对表执行该操作,将其与自身进行比较并能够识别每一侧,您可以使用表别名。x
是表别名。它被分配在from
像这样的子句:from <table> <alias>
. x
现在可以在同一查询的其他地方使用该表作为快捷方式引用。
delete x
从我们的操作和目标开始查询。我们将执行一个查询来从多个表中选择记录,并且我们想要删除出现在x
.
别名用于引用表的两个“实例”。from myTable x join myTable z on x.subscriberEmail = z.subscriberEmail
在电子邮件匹配的地方将表格与自身碰撞。如果没有后面的 where 子句,则每条记录都将被选择,因为它可以与自身结合起来。
The where
子句限制选择的记录。where x.id > z.id
允许“实例”别名x
仅包含与电子邮件匹配但具有更高的记录id
价值。表中您真正想要的数据,唯一的电子邮件地址(具有最低 ID)将不会成为x
并且不会被删除。唯一的记录在x
将是具有更高值的重复记录(电子邮件地址)id
比该电子邮件地址的原始记录。
在这种情况下,可以组合 join 和 where 子句:
delete x
from myTable x
join myTable z
on x.subscriberEmail = z.subscriberEmail
and x.id > z.id
为了防止重复,请考虑将subscriberEmail 列设置为UNIQUE 索引列。