Začněte identifikací registrací ostatních klientů registrace. Zde je pohled:
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 nám dává:
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
Samozřejmě nepotřebujete výhled; je to jen pro pohodlí. Můžete použít pouze virtuální stůl. Pečlivě si jej však prohlédněte, abyste se přesvědčili, že pro každého klienta vytváří správný rozsah „registrací kamarádů“. Všimněte si, že zobrazení není odkaz Registration
. To je důležité, protože poskytuje stejné výsledky, i když je použijeme k odstranění z Registration
, takže jej můžeme použít pro druhý příkaz delete.
Nyní máme seznam klientů a jejich "kamarádských registrací". Jaké je datum poslední registrace každého kamaráda?
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
Které z nich mají nejnovější datum před určitým časem?
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, což by znamenalo, že klient č. 4 by měl být smazán a vše, pro co se zaregistroval, by mělo být smazáno. Registrace by byly
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
A opravdu, klient #4 je v registraci #5 a je jediným klientem, který je tímto testem vymazán.
Odtud můžete provést delete
prohlášení. Myslím, že pravidlo je "smazat klienta a vše, k čemu se zaregistroval". Pokud ano, pravděpodobně bych zapsal registrační ID do dočasné tabulky a zapsal smazání pro obě Registration
a AssociatedClient
tím, že se k němu připojíte.