SQLite | SELECT 結果に行番号 (連番) を付けるときの注意点

SQLite | SELECT 結果に行番号 (連番) を付けるときの注意点

SQLite に ROW_NUMBER や ROWNUM があれば便利なのですが、ないので、サブクエリで実装することになりますが、
初心者の自分が言うのも何ですが、ググって出てくる多くのサンプルは不完全なものだったので、失敗例と、たぶんコレで完全?というのをメモしておきます (^^;

失敗例1.rowid で代用

UPDATE でデータを書き換えたり、DELETE で削除したりすれば簡単に連番でなくなってしまうし、1 から始まるかどうかもわからないので、単に rownum を rowid に書き換えただけでは動きません。思い通りには動きません。

失敗 (?) 例2.count と >= (等号付き不等号) で、サブクエリで実装するやつ

ググると良く出てくるやつですが、カラムの値が重複する場合にメチャクチャな数が返ってしまいます。
カラムの値が重複しない UNIQUE や PRIMARY KEY なら問題ないです (^^;
例: 降順に並べる

select (
    select count([カラム]) from [テーブル] as s
    where s.[カラム] >= m.[カラム]
) as no,
* from [テーブル] as m
order by no asc;

実行例: 番号がメチャクチャになっている

失敗 (??) 例3.count + 1 と > (等号無し不等号) で、サブクエリで実装するやつ

こちらは使い方によってはむしろ正しい動作をします。
点数順にランキングにする時など、点数が同じなら同じ順位になりますからね (^^;
(等号付きだとこの数値にすらならない)
ただ、結果の行番号として表示したい時は重複しちゃうと困る (><
例: 降順に並べて順位の番号を付加

select (
    select count([カラム]) + 1 from [テーブル] as s
    where s.[カラム] > m.[カラム]
) as no,
* from [テーブル] as m
order by no asc;

実行例: 順位だったら問題ないんだけどさ…今は行番号として表示したいんだわさ… (^^;

たぶん完全なやつ

重複してしまうせいで ちゃんと処理できないのなら、並び替えたりカラムのほかに、「値が重複することがないカラム」でさらに絞り込めば良いじゃん!
そういうカラムを他に設定していないのであれば、rowid を指定する!
例: 降順に並べて、重複した場合は rowid 降順

select (
    select count(rowid) + 1 from [テーブル] as s
    where s.[カラム] > m.[カラム] or (s.[カラム] == m.[カラム] and s.rowid > m.rowid)
) as no,
* from [テーブル] as m
order by no asc;

さっき載せたテーブルだとカラムが 1 つしかないので rowid を使うしかないですが、他に重複しないカラムがあるなら、それでさらに絞れば、わざわざ rowid を使う必要はなくなります。(^^
実行例: うまくいったよぉ (>▽</

まとめ

ようは、重複する値がなければ問題ないけど、ある時はちゃんと対応しないとダメ!って話でした (^^;
今回はこのへんで~
ノシ


「SQLite | SELECT 結果に行番号 (連番) を付けるときの注意点」への1件のフィードバック

  1. >内緒さん
    ありがとうございます (^^

    人それぞれが、自分ができる (分かる) ことを付き進めていけば良いと思いますよ (^^

コメントは受け付けていません。