10

SQLite3のテーブルに「インデックス」列を追加して、ユーザーが古いデータベースの名前を変更し、その場所に追加の列を使用して新しいデータベースを作成することで、データを簡単に並べ替えられるようにします。

私が抱えている問題は、古い値をINSERT ... SELECTするときに、「インデックス」列の各行に一意の番号を付ける必要があることです。

私が行った検索では、OracleでROWNUMという有用な用語が見つかりましたが、SQLite3にはそれがありません。SQLiteに同等のものはありますか?

4

4 に答える 4

13

特別な行名の1つを使用するかROWIDOID_ROWID_のROWIDを取得できます。詳細については、 http://www.sqlite.org/lang_createtable.html#rowidを参照してください(また、と呼ばれる通常の列によって行を非表示にすることができますROWID)。

于 2012-09-02T10:24:26.203 に答える
8

SQLiteには、OracleのROWNUMに直接相当するものはありません。

要件を正しく理解していれば、古いテーブルの順序に基づいて番号付きの列を次のように追加できるはずです。

create table old (col1, col2);

insert into old values
    ('d', 3),
    ('s', 3),
    ('d', 1),
    ('w', 45),
    ('b', 5465),
    ('w', 3),
    ('b', 23);

create table new (colPK INTEGER PRIMARY KEY AUTOINCREMENT, col1, col2);

insert into new select NULL, col1, col2 from old order by col1, col2;

新しいテーブルには次のものが含まれます。

.headers on
.mode column

select * from new;

colPK       col1        col2      
----------  ----------  ----------
1           b           23        
2           b           5465      
3           d           1         
4           d           3         
5           s           3         
6           w           3         
7           w           45

は、そのAUTOINCREMENT名前が示すとおりに機能します。追加の各行には、前の値が1ずつ増加します。

于 2012-09-02T09:23:18.387 に答える
7

ここの多くの人々はROWNUMROWIDを混同しているようです。それらは同じ概念ではなく、Oracleには両方があります。

ROWIDは、データベースROWの一意のIDです。これはほとんど不変です(インポート/エクスポート中に変更されますが、異なるSQLクエリ間で同じです)。

ROWNUMは、クエリ結果の行番号に対応する計算フィールドです。最初の行は常に1、2番目の行は2というようになります。これはどのテーブル行にも完全にリンクされておらず、同じテーブル行は、クエリの方法によっては非常に異なる行番号を持つ可能性があります。

SqliteにはROWIDがありますが、ROWNUMはありません。私が見つけた唯一の同等物はROW_NUMBER()関数です(http://www.sqlitetutorial.net/sqlite-window-functions/sqlite-row_number/を参照)。

次のようなクエリを使用して、目的を達成できます。

insert into new 
    select *, row_number() over () 
    from old;
于 2019-03-22T08:38:36.320 に答える
1

SQLiteで制約LIMITを使用したいと思います。 SELECT * FROM TABLE何千ものレコードを返すことができます。ただし、LIMITキーワードを追加することでこれを制限できます。

SELECT * FROM TABLE LIMIT 5; クエリで返されたテーブルから最初の5つのレコードを返します-可能な場合

于 2020-03-08T16:07:45.010 に答える