sql >> Database teknologi >  >> RDS >> Mysql

Problemer med at ombryde kompleks SQL-sletteforespørgsel

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.



  1. org.hibernate.InstantiationException:Ingen standardkonstruktør for entitet::principal.Cliente

  2. Kan ikke oprette forbindelse til MySQL-server på 'localhost' (10061)

  3. varchar(255) vs tinytext/tinyblob og varchar(65535) vs blob/text

  4. MYSQL, meget langsom rækkefølge