• ベストアンサー

DBから日付順に指定件数の削除を行いたい

PostgreSQL環境でのSQL文です。 テーブル[A_TABLE]のDate型の項目[mDate]をキーにして、古いものから30件を削除したいのですが、 このようなSQL文は有効でしょうか? DELETE FROM A_TABLE WHERE RowNum <= 30 ORDER BY mDate 現在手元に試してみる環境が無いため困っています。 よろしくお願いします。

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

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

incho0922さんのSQLに補足しいますと、 DELETE FROM A_TABLE AS A_TABLE_1 WHERE ID = ( SELECT ID FROM A_TABLE AS A_TABLE_2 ORDER BY mDate LIMIT 30 ) だと、副問い合わせの文では複数行返してしまいますので"="だとエラーになってしまいます。 ですので、 DELETE FROM A_TABLE AS A_TABLE_1 WHERE ID IN ( SELECT ID FROM A_TABLE AS A_TABLE_2 ORDER BY mDate LIMIT 30 ) ならご希望の結果が得られると思います。

taku_pan
質問者

お礼

ありがとうございます。 ROWNUM句はOracleでしか使えない?ようですね。 DB環境で試してみるとエラーとなりました。 "AS" で引っ掛かったのですが、以下のSQLで求める動作ができそうです。 DELETE FROM A_TABLE WHERE ID IN ( SELECT ID FROM A_TABLE AS A_TABLE_2 ORDER BY mDate LIMIT 30 ) 何かありましたらご指摘頂けると助かります。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • incho0922
  • ベストアンサー率41% (84/204)
回答No.1

回答ではありません。 PostgreSQLには詳しくありませんし、現在手元に実行環境がありませんので、SQL一般で考えてみました。(役に立たなくてすみません^_^;) おそらく、RowNumというフィールドがなければ、このSQL文はエラーになると思います。 MS SQLなどではSELECT文中にTOP句が使えるので、同じようなことができないかと、PostgreSQLのリファレンスを見てみたところ、LIMIT句というのがありますね。 LIMIT句を使うと、ORDER BYで並べ替えた結果の先頭30件などを取得できるので、 A_TABLEの主キーのフィールドがIDと仮定すると SELECT ID FROM A_TABLE ORDER BY mDate LIMIT 30 で、古いものから30件が取得できますから、それをDELETE文のWHERE条件に指定したらお望みのことができそうです。 DELETE FROM A_TABLE AS A_TABLE_1 WHERE ID = ( SELECT ID FROM A_TABLE AS A_TABLE_2 ORDER BY mDate LIMIT 30 ) などとしてみたらできそうな気がしますが、なにぶん試す環境がありません。m(__)m 参考URLを載せておきますので、試してみてください。

参考URL:
http://www.postgresql.jp/document/pg814doc/html/sql-select.html#SQL-LIMIT
taku_pan
質問者

お礼

ありがとうございます。 ROWNUM句はOracleでしか使えない?ようですね。 DB環境で試してみるとエラーとなりました。 "AS" で引っ掛かったのですが、以下のSQLで求める動作ができそうです。 DELETE FROM A_TABLE WHERE ID IN ( SELECT ID FROM A_TABLE AS A_TABLE_2 ORDER BY mDate LIMIT 30 ) 何かありましたらご指摘頂けると助かります。

すると、全ての回答が全文表示されます。

専門家に質問してみよう