アプリ版:「スタンプのみでお礼する」機能のリリースについて

PostgreSQL環境でのSQL文です。
テーブル[A_TABLE]のDate型の項目[mDate]をキーにして、古いものから30件を削除したいのですが、
このようなSQL文は有効でしょうか?
DELETE FROM A_TABLE WHERE RowNum <= 30 ORDER BY mDate

現在手元に試してみる環境が無いため困っています。
よろしくお願いします。

A 回答 (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 )

ならご希望の結果が得られると思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。
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 )

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

お礼日時:2006/10/11 15:01

回答ではありません。


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/ …
    • good
    • 0
この回答へのお礼

ありがとうございます。
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 )

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

お礼日時:2006/10/11 15:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す