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.