2012-09-15 17 views
5

mam tę bazę danych sqlite (tabela1):Jak dodać nową kolumnę do widoku w sqlite?

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

Chcę utworzyć widok z wszystkimi elementami poziomu 2, a następnie dodać nową kolumnę wskazujący kolejność wiersza w nowej tabeli. Oznacza to, że chciałbym ten wynik:

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

próbowałem:

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

Ale wtedy otrzymamy:

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

Przypuszczam, powinno być coś jak :

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

Co należy używać zamiast XXXX?

+0

Dlaczego potrzebujesz kolumny zamówienia bez dziur? –

Odpowiedz

1

Gdy zlecenie _id liczba rzędów włącznie ta jest taka sama, jak liczba wierszy, gdy wartość _id jest mniejsza niż lub równa tej Row _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; 

(obliczenia sama właściwie nie wymagają ORDER BY _id ponieważ kolejność wierszy nie ma znaczenia, gdy jesteśmy tylko ich liczenie)

należy pamiętać, że nie jest gwarantowana words być posortowane.; w razie potrzeby dodaj ORDER BY "index".


I to oczywiście nie jest zbyt wydajne.

+0

Dzięki CL. Działa świetnie! –

-2

Masz dwie opcje. Po pierwsze, można po prostu dodać nową kolumnę z poniższym:

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

drugi i więcej complicatedly, ale faktycznie umieścić kolumnę, w której chcesz go, byłoby zmienić nazwę tabeli:

ALTER TABLE {tableName} RENAME TO TempOldTable; 

Następnie należy utworzyć nową tabelę o brakujące kolumny:

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

i wypełnić go ze starym danych:

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

Następnie usunąć starą tabelę:

DROP TABLE TempOldTable; 

ja bym zdecydowanie wolą drugą opcję, gdyż pozwoli Ci całkowicie zmienić nazwę wszystkiego w razie potrzeby.

Powiązane problemy