Beginnen Sie damit, die Registrierungen der anderen Clients einer Registrierung zu identifizieren. Hier ist eine Ansicht:
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;
Das gibt uns:
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
Sie brauchen natürlich keine Aussicht; es ist nur aus Bequemlichkeit. Sie könnten einfach einen virtuellen Tisch verwenden. Aber überprüfen Sie es sorgfältig, um sich selbst davon zu überzeugen, dass es für jeden Kunden die richtige Auswahl an „Freundesregistrierungen“ produziert. Beachten Sie, dass die Ansicht nicht Referenz Registration
. Das ist wichtig, weil es die gleichen Ergebnisse liefert, auch nachdem wir es zum Löschen aus Registration
verwendet haben , sodass wir es für die zweite Löschanweisung verwenden können.
Jetzt haben wir eine Liste von Kunden und deren "Kumpelregistrierungen". Was ist das Datum der letzten Registrierung jedes Freundes?
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
Welche haben ein spätestes Datum vor einer bestimmten Uhrzeit?
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, das würde bedeuten, dass Kunde Nr. 4 gelöscht werden sollte, und alles, wofür er sich registriert hat, sollte gelöscht werden. Registrierungen wären
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
Und tatsächlich befindet sich Client Nr. 4 in Registrierung Nr. 5 und ist der einzige Client, der bei diesem Test gelöscht wird.
Von dort aus können Sie das delete
erarbeiten Aussagen. Ich denke, die Regel lautet "Lösche den Kunden und alles, wofür er sich registriert hat". Wenn ja, würde ich wahrscheinlich die Registrierungs-IDs in eine temporäre Tabelle schreiben und die Löschungen für beide Registration
schreiben und AssociatedClient
indem Sie sich ihr anschließen.