ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.2455311 DBから日付順に指定件数の削除を行いたい
質問者:taku_pan PostgreSQL環境でのSQL文です。
テーブル[A_TABLE]のDate型の項目[mDate]をキーにして、古いものから30件を削除したいのですが、
このようなSQL文は有効でしょうか?
DELETE FROM A_TABLE WHERE RowNum <= 30 ORDER BY mDate

現在手元に試してみる環境が無いため困っています。
よろしくお願いします。
困り度:
  • すぐに回答を!
質問投稿日時:
06/10/06 18:40
この質問に対する回答は締め切られました。

回答良回答20pt

ANo.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 )

ならご希望の結果が得られると思います。
回答者:braver_2004
種類:回答
どんな人:専門家
自信:自信あり
回答日時:
06/10/09 23:54
この回答へのお礼ありがとうございます。
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 )

何かありましたらご指摘頂けると助かります。

回答良回答10pt

ANo.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を載せておきますので、試してみてください。
回答者:incho0922
種類:アドバイス
どんな人:専門家
自信:参考意見
回答日時:
06/10/07 17:16
参考URL: http://www.postgresql.jp/document/pg814doc/html/sql-select.html#SQL...
この回答へのお礼ありがとうございます。
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 )

何かありましたらご指摘頂けると助かります。