私は非常に奇妙な問題をsqlite3 - Windows用のsqlite3バージョン3.20.1を実行しています。SQLite強制的にソートSELECT
2つの異なるテーブルで同じSELECTクエリが異なる結果を生成します。ただし、列のデータ型とデータは両方とも同じです。 CREATE文とINSERT文があります。
CREATE TABLE key(key INTEGER UNIQUE NOT NULL);
CREATE TABLE map(key INTEGER UNIQUE NOT NULL, char TEXT);
WITH RECURSIVE cnt(x) AS (SELECT 1 UNION ALL SELECT x+1 FROM cnt LIMIT 9999) INSERT INTO key(key) SELECT x FROM cnt WHERE x >=1000 ORDER BY random();
WITH RECURSIVE cnt(x) AS (SELECT 1 UNION ALL SELECT x+1 FROM cnt LIMIT 9999) INSERT INTO map(key) SELECT x FROM cnt WHERE x >=1000 ORDER BY random();
これは、両方の列にランダムに順序付けされた1000〜9999の数字を挿入する必要があります。ただし、2番目のテーブルのSELECT文は常にソートされます。ここに結果があります
sqlite> SELECT key FROM map LIMIT 10;
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
sqlite> SELECT key FROM key LIMIT 10;
6165
1856
2457
2343
9095
8005
4958
4781
8334
1863
私は次のことを試みました。
sqlite> DELETE FROM map;
sqlite> INSERT INTO map(key) SELECT key FROM key;
sqlite>
sqlite> SELECT key FROM map LIMIT 10;
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
まだ分類されています。 REPLACEを使っても役に立ちませんでした。 id列を最初に追加してテーブルスキーマを少し変更しようとしましたが、成功しませんでした。
いくつかの実験の後、私はSELECT *
が正しい順序でそれを示しているが、SELECT key
は順序付けられた結果を与えることを発見した。
sqlite> SELECT * FROM map LIMIT 10;
8418|
5869|
9753|
2886|
8354|
8244|
4063|
6692|
5440|
3508|
説明できますか?バグか機能ですか?どのようにして期待される出力を得ることができますか?
ありがとうございました。非常に役立ちます! – Dawood
'ORDER BY ROWID'を追加すると期待される結果が得られます。 – Dawood