Bắt đầu bằng cách xác định đăng ký của các khách hàng khác của một đăng ký. Đây là một chế độ xem:
create view groups as
select a.Client_id
, c.Registration_id
from AssociatedClient as a
join AssociatedClient as b on a.Registration_id = b.Registration_id
join AssociatedClient as c on b.Client_id = c.Client_id;
Điều đó mang lại cho chúng tôi:
select Client_id
, min(Registration_id) as first
, max(Registration_id) as last
, count(distinct Registration_id) as regs
, count(*) as pals
from groups
group by Client_id;
Client_id first last regs pals
---------- ---------- ---------- ---------- ----------
2 2 8 4 5
3 2 8 4 18
4 5 5 1 1
5 2 8 4 5
7 10 10 1 1
8 9 9 1 1
Tất nhiên, bạn không cần xem; nó chỉ để thuận tiện. Bạn chỉ có thể sử dụng một bảng ảo. Nhưng hãy kiểm tra cẩn thận để tự thuyết phục rằng nó tạo ra phạm vi "đăng ký bạn bè" phù hợp cho từng khách hàng. Lưu ý rằng chế độ xem không tham chiếu Registration
. Điều đó rất quan trọng vì nó tạo ra kết quả tương tự ngay cả sau khi chúng tôi sử dụng nó để xóa khỏi Registration
, vì vậy chúng ta có thể sử dụng nó cho câu lệnh xóa thứ hai.
Bây giờ chúng tôi có một danh sách các khách hàng và "đăng ký bạn bè" của họ. Ngày đăng ký cuối cùng của mỗi người bạn là gì?
select g.Client_id, max(Registration_date) as last_reg
from groups as g join Registration as r
on g.Registration_id = r.Id
group by g.Client_id;
g.Client_id last_reg
----------- ----------
2 2011-10-14
3 2011-10-14
4 2011-10-07
5 2011-10-14
7 2011-10-17
8 2011-10-14
Những người nào có ngày muộn nhất trước một thời gian nhất định?
select g.Client_id, max(Registration_date) as last_reg
from groups as g join Registration as r
on g.Registration_id = r.Id
group by g.Client_id
having max(Registration_date) < '2011-10-08';
g.Client_id last_reg
----------- ----------
4 2011-10-07
IIUC điều đó có nghĩa là khách hàng số 4 sẽ bị xóa và bất kỳ thứ gì anh ta đã đăng ký sẽ bị xóa. Đăng ký sẽ là
select * from Registration
where Id in (
select Registration_id from groups as g
where Client_id in (
select g.Client_id
from groups as g join Registration as r
on g.Registration_id = r.Id
group by g.Client_id
having max(Registration_date) < '2011-10-08'
)
);
Id Registration_date
---------- -----------------
5 2011-10-07
Và, chắc chắn, ứng dụng khách số 4 nằm trong Đăng ký số 5 và là ứng dụng khách duy nhất bị xóa bởi thử nghiệm này.
Từ đó, bạn có thể tìm ra delete
các câu lệnh. Tôi nghĩ quy tắc là "xóa khách hàng và bất kỳ thứ gì anh ta đã đăng ký". Nếu vậy, có lẽ tôi sẽ ghi ID đăng ký vào một bảng tạm thời và ghi các lần xóa cho cả Registration
và AssociatedClient
bằng cách tham gia vào nó.