2012-09-15 22 views
5

que tienen esta base de datos SQLite (tabla 1):¿Cómo agregar una nueva columna en una vista en sqlite?

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

Quiero crear una vista con todos los elementos de nivel 2 y luego para añadir una nueva columna que indica el orden de la fila en la tabla nueva. Es decir, me gustaría que este resultado:

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

que he intentado:

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

Pero entonces me sale:

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

supongo que debe ser algo tan :

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

¿Qué debo usar en lugar de XXXX?

+0

¿Por qué necesita una columna de pedido sin agujeros? –

Respuesta

1

Cuando ordenado por _id, el número de filas hasta e incluyendo éste es el mismo que el número de filas en las que el valor _id es menor que o igual a de esta fila _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; 

(La el cálculo en sí mismo no requiere realmente ORDER BY _id porque el orden de las filas no importa cuando las estamos contando).

Tenga en cuenta que words no se garantiza que esté ordenado; agregue ORDER BY "index" si es necesario.


Y esto es, por supuesto, no muy eficiente.

+0

Gracias CL. ¡Funciona genial! –

-2

Tiene dos opciones. En primer lugar, usted podría simplemente agregar una nueva columna con la siguiente:

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

En segundo lugar, y más complicada, pero en realidad poner la columna donde desee, sería la de cambiar el nombre de la tabla:

ALTER TABLE {tableName} RENAME TO TempOldTable; 

a continuación, cree la nueva tabla con la columna que falta:

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

y rellenarla con la vieja datos:

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

continuación, elimine la tabla antigua:

DROP TABLE TempOldTable; 

Yo más prefieren la segunda opción, ya que le permitirá cambiar el nombre completo todo si es necesario.

Cuestiones relacionadas