Rozpocznij od identyfikacji rejestracji innych klientów rejestracji. Oto widok:
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;
To daje nam:
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
Oczywiście nie potrzebujesz widoku; to tylko dla wygody. Możesz po prostu użyć wirtualnego stołu. Ale sprawdź go dokładnie, aby przekonać się, że zapewnia odpowiedni zakres „rejestracji znajomych” dla każdego klienta. Pamiętaj, że widok nie referencja Registration
. To ważne, ponieważ daje te same wyniki nawet po użyciu go do usunięcia z Registration
, więc możemy go użyć do drugiej instrukcji delete.
Teraz mamy listę klientów i ich „rejestracje kumpli”. Jaka jest data ostatniej rejestracji każdego kumpla?
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
Które mają ostatnią datę przed pewnym czasem?
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 oznaczałoby to, że klient nr 4 powinien zostać usunięty, a wszystko, na co się zarejestrował, powinno zostać usunięte. Rejestracje byłyby
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
I rzeczywiście, klient nr 4 znajduje się w rejestracji nr 5 i jest jedynym klientem, który może zostać usunięty przez ten test.
Stamtąd możesz wypracować delete
sprawozdania. Myślę, że regułą jest „usuń klienta i wszystko, na co się zarejestrował”. Jeśli tak, prawdopodobnie zapisałbym identyfikatory rejestracji w tabeli tymczasowej i zapisałbym usunięcia dla obu Registration
i AssociatedClient
dołączając do niego.