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

AndoroidでDBを使うのですが、考える動作のSQL文が作成できません。

テーブルTESTは以下のカラムを持ちます
 ・ID - primary key not null
 ・VALUE - not null

テーブルTESTは最大で10件のレコードを保持します、11件目のレコードが発生したら
最も古い1件目のレコードを削除してから、11件目のデータを新しい10件目のデータとして
テーブルに保存します。

そのために「最も古いレコード1件のみを削除する」というSQLを作成したいのですが、
考えたSQL文が正しくないと怒られてしまいます。

delete from TEST as A, (select * from TEST LIMIT 1)as B where A.ID=B.ID;

この動作を1つのSQL文で行うのは不可能なのでしょうか?

A 回答 (2件)

NOT EXISTS条件はカッコ内のSELECT文でレコードが取得できないときにTRUEになります。


先ほどのSQLの、

>where not exists(
>select * from Test as tb
>where Test.ID > tb.ID);

のSELECT文でTestテーブルから自レコードよりIDが小さいレコードを取得しています。
#tbはただのテーブル別名です。
#SQLiteだとDELETE対象のテーブルにはテーブル別名がつけられない(?)ようだったのでTestと指定しています。

レコードが取得できない = 自レコードのIDが最も小さい ということになります。
なんとなく分かっていただけますかね・・・
    • good
    • 1
この回答へのお礼

丁寧な解説ありがとうございます。
良く判りました!

自レコードより小さいIDが取得できなかったレコードが、最も小さいレコードなので、それを条件に削除するのですね。

教えていただかなければ絶対に、思いつかないSQL文でした。
ありがとうございました。

お礼日時:2011/05/09 16:49

「最も古い」という判断をする条件はなんなのでしょうか?


IDが最も小さいもの、ということであれば

delete from Test
where not exists(
select * from Test as tb
where Test.ID > tb.ID);

でいいと思いますが。

この回答への補足

解答ありがとうございます。

最も古いとは、一番最初に挿入されたレコードです。
IDはプライマリでシーケンス番号なので、IDが最も小さいものになります。

教えていただいたSQLを実行したら、期待した結果になったのですが、お恥ずかしい話、処理の理解ができません。
「where GPS_INFO.ID > tb.ID」とは何をしているのでしょうか?

補足日時:2011/05/09 15:52
    • good
    • 0

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

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