5

私はこのデータベースをsqlite(table1)に持っています:

+-----+-------+-------+
| _id | name  | level |
+-----+-------+-------+
| 1   | Mike  | 3     |
| 2   | John  | 2     |
| 3   | Bob   | 2     |
| 4   | David | 1     |
| 5   | Tom   | 2     |
+-----+-------+-------+

レベル 2 のすべての要素を含むビューを作成し、新しいテーブルの行の順序を示す新しい列を追加したいと考えています。つまり、次の結果が必要です。

+-------+------+
| index | name |
+-------+------+
| 1     | John |
| 2     | Bob  |
| 3     | Tom  |
+-------+------+

私が試してみました:

CREATE VIEW words AS SELECT _id as index, name FROM table1;

しかし、私は得る:

+-------+------+
| index | name |
+-------+------+
| 2     | John |
| 3     | Bob  |
| 5     | Tom  |
+-------+------+

私はそれが次のようなものであるべきだと思います:

CREATE VIEW words AS SELECT XXXX as index, name FROM table 1;

の代わりに何を使用すればよいXXXXですか?

4

2 に答える 2

1

で並べ_id替えると、これまでの行数は、_id値がこの行の値以下である行数と同じになり_idます。

CREATE VIEW words AS
  SELECT (SELECT COUNT(*)
          FROM table1 b
          WHERE level = 2
            AND b._id <= a._id) AS "index",
         name
  FROM table1 a
  WHERE level = 2;

ORDER BY _id(行を数えるだけでは行の順序は重要ではないため、計算自体は実際には必要ありません。)

wordsソートが保証されていないことに注意してください。必要に応じて追加ORDER BY "index"します。


もちろん、これはあまり効率的ではありません。

于 2012-09-15T10:12:10.917 に答える
-2

2つのオプションがあります。まず、次のように新しい列を追加するだけです。

ALTER TABLE {tableName} ADD COLUMN COLNew {type};

次に、より複雑ですが、実際には必要な場所に列を配置し、テーブルの名前を変更します。

ALTER TABLE {tableName} RENAME TO TempOldTable;

次に、欠落している列を含む新しいテーブルを作成します。

CREATE TABLE {tableName} (name TEXT, COLNew {type} DEFAULT {defaultValue}, qty INTEGER, rate REAL);

そして、古いデータを入力します。

INSERT INTO {tableName} (name, qty, rate) SELECT name, qty, rate FROM TempOldTable;

次に、古いテーブルを削除します。

DROP TABLE TempOldTable;

必要に応じてすべての名前を完全に変更できるので、2番目のオプションをお勧めします。

于 2012-09-15T10:17:05.863 に答える