Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Problemy z zawijaniem głowy wokół złożonego zapytania usuwającego SQL

Rozpocznij od identyfikacji rejestracji innych klientów rejestracji. Oto widok:

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 daje nam:

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         

Oczywiście nie potrzebujesz widoku; to tylko dla wygody. Możesz po prostu użyć wirtualnego stołu. Ale sprawdź go dokładnie, aby przekonać się, że zapewnia odpowiedni zakres „rejestracji znajomych” dla każdego klienta. Pamiętaj, że widok nie referencja Registration . To ważne, ponieważ daje te same wyniki nawet po użyciu go do usunięcia z Registration , więc możemy go użyć do drugiej instrukcji delete.

Teraz mamy listę klientów i ich „rejestracje kumpli”. Jaka jest data ostatniej rejestracji każdego kumpla?

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

Które mają ostatnią datę przed pewnym czasem?

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 oznaczałoby to, że klient nr 4 powinien zostać usunięty, a wszystko, na co się zarejestrował, powinno zostać usunięte. Rejestracje byłyby

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       

I rzeczywiście, klient nr 4 znajduje się w rejestracji nr 5 i jest jedynym klientem, który może zostać usunięty przez ten test.

Stamtąd możesz wypracować delete sprawozdania. Myślę, że regułą jest „usuń klienta i wszystko, na co się zarejestrował”. Jeśli tak, prawdopodobnie zapisałbym identyfikatory rejestracji w tabeli tymczasowej i zapisałbym usunięcia dla obu Registration i AssociatedClient dołączając do niego.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 5 najlepszych narzędzi GUI MySQL (bezpłatne i płatne)

  2. Nazwa indeksu MySQL i nazwa klucza obcego muszą być różne dla różnych tabel?

  3. php, serwer mysql zniknął

  4. mysql- Jak aplikować dotacje do kolumny?

  5. Resetowanie wartości auto-inkrementacji bazy danych MySql za pomocą JPA