Започнете с идентифициране на регистрациите на другите клиенти на една регистрация. Ето един изглед:
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;
Това ни дава:
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
Нямате нужда от изглед, разбира се; това е само за удобство. Можете просто да използвате виртуална маса. Но проверете го внимателно, за да се убедите, че произвежда правилния набор от „регистрации на приятели“ за всеки клиент. Имайте предвид, че изгледът не справка Registration
. Това е важно, защото дава същите резултати дори след като го използваме за изтриване от Registration
, така че можем да го използваме за втория израз за изтриване.
Сега имаме списък с клиенти и техните "приятелски регистрации". Коя е датата на последната регистрация на всеки приятел?
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
Кои имат последна дата преди определено време?
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, което би означавало, че клиент #4 трябва да бъде изтрит и всичко, за което се е регистрирал, трябва да бъде изтрито. Регистрациите ще бъдат
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
И, разбира се, клиент #4 е в регистрация #5 и е единственият клиент, който подлежи на изтриване от този тест.
От там можете да изработите delete
изявления. Мисля, че правилото е "изтрийте клиента и всичко, за което се е регистрирал". Ако е така, вероятно ще запиша идентификаторите за регистрация във временна таблица и ще напиша изтриванията и за двете Registration
и AssociatedClient
като се присъедини към него.