登録の他のクライアントの登録を識別することから始めます。ビューは次のとおりです:
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;
それは私たちに与えます:
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
もちろん、ビューは必要ありません。便宜上です。仮想テーブルを使用することもできます。ただし、慎重に調べて、各クライアントに適切な範囲の「pal登録」が生成されることを確認してください。ビューはしないことに注意してください 参照Registration
。 Registration
から削除するために使用した後でも同じ結果が得られるため、これは重要です。 、したがって、2番目のdeleteステートメントに使用できます。
これで、クライアントとその「仲間登録」のリストができました。各仲間の最後の登録日はいつですか?
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
特定の時間より前に最新の日付を持っているのはどれですか?
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は、クライアント#4を削除し、彼が登録したものはすべて削除する必要があることを意味します。登録は
になります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
そして、確かに、クライアント#4は登録#5にあり、このテストによる削除の対象となる唯一のクライアントです。
そこから、delete
を実行できます ステートメント。ルールは「クライアントと彼が登録したものはすべて削除する」だと思います。もしそうなら、私はおそらく登録IDを一時テーブルに書き込み、両方のRegistration
の削除を書き込みます。 およびAssociatedClient
それに参加することによって。