Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Masalah membungkus kepala di sekitar permintaan penghapusan SQL yang kompleks

Mulailah dengan mengidentifikasi pendaftaran klien lain dari pendaftaran. Berikut tampilannya:

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;

Itu memberi kita:

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         

Anda tidak perlu pemandangan, tentu saja; itu hanya untuk kenyamanan. Anda bisa menggunakan tabel virtual. Tetapi periksa dengan cermat untuk meyakinkan diri Anda bahwa itu menghasilkan rentang "pendaftaran teman" yang tepat untuk setiap klien. Perhatikan bahwa tampilan tidak referensi Registration . Itu penting karena menghasilkan hasil yang sama bahkan setelah kami menggunakannya untuk menghapus dari Registration , jadi kita bisa menggunakannya untuk pernyataan hapus kedua.

Sekarang kami memiliki daftar klien dan "pendaftaran teman" mereka. Apa tanggal pendaftaran terakhir masing-masing sobat?

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

Manakah yang memiliki tanggal terbaru sebelum waktu tertentu?

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 itu berarti bahwa klien #4 harus dihapus, dan apa pun yang dia daftarkan harus dihapus. Pendaftaran akan menjadi

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       

Dan, tentu saja, klien #4 ada di Registrasi #5, dan merupakan satu-satunya klien yang harus dihapus oleh tes ini.

Dari sana Anda dapat mengerjakan delete pernyataan. Saya pikir aturannya adalah "hapus klien dan apa pun yang dia daftarkan". Jika demikian, saya mungkin akan menulis ID Pendaftaran ke tabel sementara, dan menulis penghapusan untuk keduanya Registration dan AssociatedClient dengan bergabung di dalamnya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Properti ConnectionString belum diinisialisasi kesalahan

  2. Cara menghubungkan Google Cloud SQL dengan C#

  3. SQL WHERE kondisi tidak sama dengan?

  4. Perbedaan antara BINARY(16) dan CHAR(32) saat menyimpan MD5 di database

  5. Dapatkan tabel terkunci di kueri mysql