2012-09-15 20 views
5

Ho questo database in SQLite (tabella 1):Come aggiungere una nuova colonna in una vista in sqlite?

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

voglio creare una vista con tutti gli elementi di livello 2 e quindi per aggiungere una nuova colonna che indica l'ordine della fila nella nuova tabella. Cioè, vorrei questo risultato:

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

ho provato:

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

Ma poi ho capito:

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

Suppongo che dovrebbe essere qualcosa come :

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

Cosa devo usare al posto di XXXX?

+0

Perché hai bisogno di una colonna ordini senza buchi? –

risposta

1

Quando ordinare per _id, il numero di righe fino a tutto questo è uguale al numero di righe in cui il valore _id è inferiore o uguale a di questa riga _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; 

(The il calcolo stesso non richiede in realtà lo ORDER BY _id perché l'ordine delle righe non ha importanza quando le stiamo solo contando.)

Si noti che lo standard words non può essere ordinato; aggiungi ORDER BY "index" se necessario.


E questo è, ovviamente, non molto efficiente.

+0

Grazie CL. Funziona alla grande! –

-2

Hai due opzioni. In primo luogo, si potrebbe semplicemente aggiungere una nuova colonna con il seguente:

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

In secondo luogo, e più complicatamente, ma sarebbe in realtà messo la colonna in cui si desidera, sarebbe quella di rinominare la tabella:

ALTER TABLE {tableName} RENAME TO TempOldTable; 

quindi creare la nuova tabella con la colonna mancante:

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

e popolare con i vecchi dati:

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

quindi eliminare la vecchia tabella:

DROP TABLE TempOldTable; 

mi piacerebbe molto preferiscono la seconda opzione, in quanto vi permetterà di rinominare tutto completamente se necessario.

Problemi correlati