sql >> データベース >  >> RDS >> Mysql

複雑なSQL削除クエリに頭を悩ませる

    登録の他のクライアントの登録を識別することから始めます。ビューは次のとおりです:

    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登録」が生成されることを確認してください。ビューはしないことに注意してください 参照RegistrationRegistrationから削除するために使用した後でも同じ結果が得られるため、これは重要です。 、したがって、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 それに参加することによって。



    1. Mysql一致する連続する行をカウントする

    2. Capgemini AgileInnovationPlatformとOracleCloudを使用した大規模なクラウドネイティブとDevSecOps

    3. SQLiteエラーに複数の行を挿入します(エラーコード=1)

    4. SELECTのMySQL条件付きSELECT