Commencez par identifier les inscriptions des autres clients d'une inscription. Voici une vue :
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;
Cela nous donne :
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
Vous n'avez pas besoin d'une vue, bien sûr; c'est juste pour le confort. Vous pouvez simplement utiliser une table virtuelle. Mais inspectez-le attentivement pour vous convaincre qu'il produit la bonne gamme "d'enregistrements de copains" pour chaque client. Notez que la vue ne le fait pas référence Registration
. C'est important car cela produit les mêmes résultats même après l'avoir utilisé pour supprimer de Registration
, afin que nous puissions l'utiliser pour la deuxième instruction de suppression.
Nous avons maintenant une liste de clients et leurs "enregistrements de copains". Quelle est la date de la dernière inscription de chaque ami ?
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
Lesquels ont une date limite avant une heure certaine ?
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, cela signifierait que le client n ° 4 devrait être supprimé et que tout ce pour quoi il s'est inscrit devrait être supprimé. Les inscriptions seraient
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
Et, bien sûr, le client #4 est dans l'enregistrement #5, et est le seul client sujet à suppression par ce test.
De là, vous pouvez travailler sur le delete
déclarations. Je pense que la règle est "supprimer le client et tout ce pour quoi il s'est inscrit". Si c'est le cas, j'écrirais probablement les identifiants d'enregistrement dans une table temporaire et j'écrirais les suppressions pour les deux Registration
et AssociatedClient
en y adhérant.