詳しくないので、解釈から間違っている可能性もありそうなのですが、こういうやり方では解決にならないでしょうか?
課題
テーブルtexts
に対する下記の処理をSQLで記述します。
処理前
_id |
text |
created_at |
position |
isChecked |
4 |
s |
2020-10-28 13:35:35 |
0 |
1 |
6 |
a |
2020-10-28 13:35:46 |
4 |
1 |
7 |
k |
2020-10-28 13:50:33 |
2 |
0 |
処理後
_id |
text |
created_at |
position |
isChecked |
4 |
s |
2020-10-28 13:35:35 |
0 |
1 |
6 |
a |
2020-10-28 13:35:46 |
2 |
1 |
7 |
k |
2020-10-28 13:50:33 |
1 |
0 |
課題の意味
position
列の昇順に、0
で始まる連番を振り直します。
考察
UPDATE texts AS m SET position = (
SELECT COUNT(*) - 1 FROM texts
WHERE position <= m.position
);
このSQL文はエラーせずに完了しますが、課題は達成できず、position
列は0, 2, 2
になります。
これは、条件に使用してるテーブル(m)を書き替えてしまうためです。
ソートしたテーブルを更新することで回避できれば良いのですが、SQLiteではUPDATE
にORDER BY
が使えないという問題が立ち塞がるわけですね。
一応の解決
少々トリッキーな方法ですが、テーブルにカラムtemp
を追加した上で、以下のSQLを実行するというのはいかがでしょうか。
UPDATE texts AS m SET temp = (
SELECT COUNT(*) - 1 FROM texts
WHERE position <= m.position
);
UPDATE texts SET position = temp;