- ベストアンサー
DBから日付順に指定件数の削除を行いたい
PostgreSQL環境でのSQL文です。 テーブル[A_TABLE]のDate型の項目[mDate]をキーにして、古いものから30件を削除したいのですが、 このようなSQL文は有効でしょうか? DELETE FROM A_TABLE WHERE RowNum <= 30 ORDER BY mDate 現在手元に試してみる環境が無いため困っています。 よろしくお願いします。
- みんなの回答 (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 ) ならご希望の結果が得られると思います。
その他の回答 (1)
- incho0922
- ベストアンサー率41% (84/204)
回答ではありません。 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を載せておきますので、試してみてください。
お礼
ありがとうございます。 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 ) 何かありましたらご指摘頂けると助かります。
お礼
ありがとうございます。 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 ) 何かありましたらご指摘頂けると助かります。