Vì bạn đang sử dụng cột id như một chỉ số mà kỷ lục là 'gốc':
delete x
from myTable x
join myTable z on x.subscriberEmail = z.subscriberEmail
where x.id > z.id
này sẽ để lại một bản ghi cho mỗi địa chỉ email.
chỉnh sửa để thêm:
Để giải thích các truy vấn trên ...
Ý tưởng ở đây là để tham gia vào bảng chống lại chính nó. Giả vờ rằng bạn có hai bản sao của bảng, mỗi bản được đặt tên khác nhau. Sau đó, bạn có thể so sánh chúng với nhau và tìm id thấp nhất hoặc cho từng địa chỉ email. Sau đó, bạn sẽ thấy các bản ghi trùng lặp được tạo sau này và có thể xóa chúng. (Tôi đã hình dung Excel khi suy nghĩ về điều này.)
Để thực hiện thao tác đó trên bàn, so sánh nó với chính nó và có thể xác định mỗi bên, bạn sử dụng bí danh bảng. x
là bí danh bảng. Nó được gán trong mệnh đề from
như sau: from <table> <alias>
. x
hiện có thể được sử dụng ở nơi khác trong cùng một truy vấn để tham chiếu đến bảng đó dưới dạng lối tắt.
delete x
bắt đầu truy vấn đầu với hành động và mục tiêu của chúng tôi. Chúng tôi sẽ thực hiện một truy vấn để chọn các bản ghi từ nhiều bảng và chúng tôi muốn xóa các bản ghi xuất hiện trong x
.
biệt hiệu được sử dụng để tham khảo cả 'trường hợp' của bảng. from myTable x join myTable z on x.subscriberEmail = z.subscriberEmail
chạm vào bảng để chống lại chính nó, nơi các email khớp với nhau. Không có mệnh đề where sau đó, mọi bản ghi sẽ được chọn vì nó có thể được nối với chính nó.
Mệnh where
giới hạn các hồ sơ được chọn. where x.id > z.id
cho phép 'mẫu' được đặt tên là x
để chỉ chứa các bản ghi khớp với email nhưng có giá trị cao hơn id
. Dữ liệu mà bạn thực sự muốn trong bảng, địa chỉ email duy nhất (có id thấp nhất) sẽ không là một phần của x
và sẽ không bị xóa. Các hồ sơ duy nhất trong x
sẽ là bản ghi trùng lặp (địa chỉ email) có số cao hơn id
so với bản ghi gốc cho địa chỉ email đó.
Các tham gia và nơi điều khoản có thể được kết hợp trong trường hợp này:
delete x
from myTable x
join myTable z
on x.subscriberEmail = z.subscriberEmail
and x.id > z.id
Để ngăn chặn bản sao, hãy xem xét làm cột subscriberEmail một cột được lập chỉ mục UNIQUE.
Bạn nên đánh dấu câu trả lời là "đã chấp nhận" :-) – watery