• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:日付の古い順番に削除したいのですが)

指定件数分の既存レコードを削除する方法は?

このQ&Aのポイント
  • テーブルの指定件数分の既存レコードを削除する方法について、日付の古い順番に削除したい場合、どのようなSQL文を使用すれば良いのか教えてください。
  • テーブルのレコード登録時に、規定数を越えている場合には指定件数分の既存レコードを削除したいのですが、どのように実現できるのか教えてください。
  • テーブルの特定のスレッド番号と端末IDに対して、指定件数分の既存レコードを削除する方法を調べています。複数のプライマリキーがある場合、どのようなSQL文を使用すればいいのか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

>残りのプライマリキーが一つならば、IN句の副問い合わせでできそうな感じですが、 >2つある為、IN句では指定できませんでした。 こんな感じで、2項目以上のIN条件(メンバーシップ検査)は可能です。 サンプルがROWNUMを使っているので、同じようにROWNUMを使った場合です。 DELETE FROM テーブル WHERE (P-Key1,P-Key2) IN ( SELECT P-Key1,P-Key2 FROM ( SELECT P-Key1,P-Key2,ROWNUM R FROM ( SELECT P-Key1,P-Key2 FROM テーブル WHERE THREAD = 1 AND TERMID = '端末ID' ORDER BY TIMESTAMP ) ) WHERE R<3 ) ; ROWNUMをROW_NUMBER分析関数に書き換えると、サブクエリが少し単純化されます。 DELETE FROM テーブル WHERE (P-Key1,P-Key2) IN ( SELECT P-Key1,P-Key2 FROM ( SELECT P-Key1,P-Key2,ROW_NUMBER() OVER(PARTITION BY P-Key1,P-Key2 ORDER BY TIMESTAMP) R FROM テーブル WHERE THREAD = 1 AND TERMID = '端末ID' ) WHERE R<3 ) ;

saigatou
質問者

お礼

ご回答を下さりまして、ありがとうございます。 ROWNUMを使ったSQL文の方で、期待の結果が得られました。 ただ、ROWNUMBER()関数を使った方では、予めSELECT文で試したところ、2件ではなく該当する全件数が出力されましたので、簡単ながら、この事も報告に添えます。 ありがとうございました。 蛇足ながら、以下に検証の為に使用したSQL文を添えます。 SELECT TO_CHAR(TIMESTAMP,'RR-MM-DD HH24:MI:SS') FROM テーブル WHERE (P-Key1,P-Key2) IN ( SELECT P-Key1,P-Key2 FROM ( SELECT P-Key1,P-Key,ROWNUM R FROM ( SELECT P-Key1,P-Key2 FROM テーブル WHERE THREAD = 1 AND TERMID = '端末ID' ORDER BY TIMESTAMP ) ) WHERE R<3 ); DELETE FROM テーブル WHERE (P-Key1,P-Key) IN ( SELECT P-Key1,P-Key2 FROM ( SELECT P-Key1,P-Key2,ROWNUM R FROM ( SELECT P-Key1,P-Key2 FROM テーブル WHERE THREAD = 1 AND TERMID = '端末ID' ORDER BY TIMESTAMP ) ) WHERE R<3 );