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

你有两个选择。首先,您可以简单地添加一个包含以下内容的新列:

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;

我更喜欢第二个选项,因为它可以让您在需要时完全重命名所有内容。

于 2012-09-15T10:17:05.863 回答