Begin met het identificeren van de registraties van de andere klanten van een registratie. Hier is een weergave:
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;
Dat geeft ons:
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
Je hebt natuurlijk geen uitzicht nodig; het is gewoon voor het gemak. Je zou gewoon een virtuele tafel kunnen gebruiken. Maar inspecteer het zorgvuldig om uzelf ervan te overtuigen dat het voor elke klant de juiste reeks "vriendregistraties" oplevert. Merk op dat de weergave niet . doet referentie Registration
. Dat is belangrijk omdat het dezelfde resultaten oplevert, zelfs nadat we het gebruiken om te verwijderen uit Registration
, zodat we het kunnen gebruiken voor de tweede delete-instructie.
Nu hebben we een lijst met klanten en hun "vriendenregistraties". Wat is de datum van de laatste registratie van elke vriend?
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
Welke hebben een uiterste datum voor een bepaalde tijd?
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 dat zou betekenen dat client #4 moet worden verwijderd en alles waarvoor hij zich heeft geregistreerd, moet worden verwijderd. Registraties zijn
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
En inderdaad, klant #4 staat in Registratie #5 en is de enige klant die door deze test kan worden verwijderd.
Van daaruit kun je de delete
. uitwerken verklaringen. Ik denk dat de regel is "verwijder de klant en alles waarvoor hij zich heeft geregistreerd". Als dat zo is, zou ik waarschijnlijk de registratie-ID's naar een tijdelijke tabel schrijven en de verwijderingen voor beide Registration
en AssociatedClient
door eraan mee te doen.