3

いくつかのテーブルを持つデータベースがあります。1 つは顧客テーブル、1 つはレンタル テーブル、もう 1 つはレンタル詳細テーブルです。Cそれぞれ、Rと呼びましょうRDRDにはレンタルされたツールのdate_inとがあり、の主キーによってリンクされています。によってリンクされています。date_outRRDRCcustomer id

基本的に私がやりたいことは、過去 3 年間何も借りていない顧客を選択 (および削除) することです。date_out > sysdate - 3 yearsそのため、ツールは 4 年前にレンタルされ、先週もレンタルされた可能性があるため、where [表現が正確なコードではありません] を使用できません。そのため、データベースに保持する必要があります。過去 3 年間、まったく借りていません。

データベース構造が遅れていることは知っていますが、変更できません。

4

2 に答える 2

3
delete from c 
where not exists ( select * 
                   from r join rd using(r_id) 
                   where c_id=c.c_id and date_out>add_months(sysdate,-36) )
于 2012-11-28T16:57:07.290 に答える
2

あなたのスキーマを正しく理解していれば、次のように書けるはずです。

DELETE
  FROM c
 WHERE c_id NOT IN
        ( SELECT DISTINCT c_id
            FROM r
           WHERE r_id IN
                  ( SELECT r_id
                      FROM rd
                     WHERE date_out > SYSDATE - (365 * 3 + 1)
                  )
        )
;

過去 3 年間のレコードに対応するレコードcがないすべてのレコードを削除します。(「3 年間」は 365 × 3 + 1 日を使用しました。これはハックですが、IMHO シンプルで簡単です。必要に応じてこれを改善できます。)rrd

上記は、外部キーにON DELETE CASCADE;がある場合にのみ適切に機能することに注意してください。そうでない場合は、これらの顧客に関連付けられているrとのレコードを削除することから始める必要があります。rdそのために、上記のクエリと同じアプローチを使用できます。

于 2012-11-28T16:52:05.217 に答える