Begynd med at identificere registreringerne af de andre kunder i en registrering. Her er en visning:
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;
Det giver os:
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
Du behøver selvfølgelig ikke udsigt; det er bare for nemheds skyld. Du kan bare bruge en virtuel tabel. Men inspicer det omhyggeligt for at overbevise dig selv om, at det producerer det rigtige udvalg af "palregistreringer" for hver klient. Bemærk, at visningen ikke gør reference Registration
. Det er vigtigt, fordi det giver de samme resultater, selv efter at vi har brugt det til at slette fra Registration
, så vi kan bruge det til den anden slettesætning.
Nu har vi en liste over kunder og deres "palregistreringer". Hvad er datoen for hver vens sidste registrering?
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
Hvilke har en seneste dato før et bestemt tidspunkt?
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, det ville betyde, at klient #4 skulle slettes, og alt hvad han registrerede sig for skulle slettes. Registreringer ville være
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
Og ganske rigtigt, klient #4 er i registrering #5, og er den eneste klient, der er genstand for sletning af denne test.
Derfra kan du udarbejde delete
udsagn. Jeg tror, at reglen er "slet klienten og alt, hvad han har registreret sig for". Hvis det er tilfældet, ville jeg sandsynligvis skrive registrerings-id'erne til en midlertidig tabel og skrive sletningerne for begge Registration
og AssociatedClient
ved at tilslutte sig det.