質問 |
||
| 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 ) 何かありましたらご指摘頂けると助かります。 |