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

ID SUB_ID STATUS 他のカラム省略
2 | 1 | 99
2 | 2 | 99
2 | 3 | 00
2 | 4 | 00
3 | 1 | 99
3 | 2 | 99
3 | 3 | 99
3 | 1 | 88
3 | 2 | 00
3 | 3 | 00
3 | 4 | 00
3 | 5 | 00
4 | 1 | 88
4 | 2 | 88
5 | 1 | 99


主キー:ID, SUB_ID, STATUS

抽出したいのは、同じIDのSTATUSが全て99か、または、全て88
の場合です。
上記の例の場合は、IDが3と4と5が抽出対象です。
データの量は多くて1万ですので、恐らくFULL SCANで
アプリに読み込んでから抽出する場合、テーブルから最初に
読み取るときに時間がかかり過ぎると思ってしまいました。

以上、宜しくお願いします。

質問者からの補足コメント

  • もう一つ、抽出条件になるカラムがありました。
    FLAGカラムです。
    FLAGカラムが一つでも、ON(1)だと抽出対象です。

    ID SUB_ID STATUS FLAG 他のカラム省略
    2 | 1 | 99 | 0
    2 | 2 | 99 | 0
    2 | 3 | 00 | 0
    2 | 4 | 00 | 0
    3 | 1 | 99 | 0
    3 | 2 | 99 | 0
    3 | 3 | 99 | 0
    4 | 1 | 88 | 1
    4 | 2 | 00 | 0
    5 | 1 | 88 | 0
    5 | 2 | 88 | 0
    6 | 1 | 99 | 0
    全て99と全て88である、ID3と5と6の他に
    FLAGが1のID4も抽出対象となります。
    FLAGカラムは1でさえあれば、抽出対象となります。

      補足日時:2016/02/16 23:09

A 回答 (2件)

select * from t where id in (select id from t group by id having

min(status) = max(status) and max(status) in (88, 99));
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
SQLを詳しくない自分が見ると、inを使っているので、
遅いような気がしてしまいます。

お礼日時:2016/02/16 23:43

これは実際のデータでもこれくらいのカーディナリティ(値の種類の多さ)なんですか?


FullScanになるかどうかはそこでも変わってくるかと思いますが・・・。
繰り返し行うんであれば、SQLだけでなく、
テーブルの方にインデックスを貼るなり
パーティションニングするなりを検討するなりしても良いかも知れませんね。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
カラム数は、全部で20くらいです。

お礼日時:2016/02/16 23:47

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