2014-12-06 109 views
0

我有3個表:SQLite的創建動態表(或查看?)

Table.Keys,Table.Tags,Table.Values

Table.Keys create table語句:

createTableStatement = "CREATE TABLE " + Tables.KEYS + "(" 
      + KeysColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," 
      + KeysColumns.KEY + " TEXT NOT NULL," 
      + "UNIQUE (" 
      + KeysColumns.KEY 
      + ") ON CONFLICT IGNORE" 
      + ");"; 
    execSQL(sqLiteDatabase, createTableStatement); 

Table.Tags create table語句:

createTableStatement = "CREATE TABLE " + Tables.TAGS + " (" 
      + TagsColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," 
      + TagsColumns.NAME + " TEXT NOT NULL," 
      + "UNIQUE (" 
      + TagsColumns.NAME 
      + ") ON CONFLICT IGNORE" 
      + ");"; 
    execSQL(sqLiteDatabase, createTableStatement); 

Table.Value create table語句:

createTableStatement = "CREATE TABLE " + Tables.VALUES + " (" 
      + ValuesColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," 
      + ValuesColumns.KEY_ID + " TEXT NOT NULL," 
      + ValuesColumns.TAG_ID + " TEXT NOT NULL," 
      + ValuesColumns.VALUE + " TEXT NOT NULL," 
      + "UNIQUE (" 
      + ValuesColumns.KEY_ID + ", " + ValuesColumns.TAG_ID 
      + ") ON CONFLICT REPLACE" 
      + ");"; 
    execSQL(sqLiteDatabase, createTableStatement); 

如果我做了以下連接:

Tables.KEYS 
+ " JOIN " + Tables.VALUES 
+ " ON " + Values.KEY_ID + " = " + Keys.column(Keys._ID) 
+ " JOIN " + Tables.TAGS 
+ " ON " + Values.TAG_ID + " = " + Tags.column(Tags._ID); 

我得到的當然是重複的行,因爲結果是

KEY | TAG | VALUE 
================= 
    |  | 

我想什麼來完成的查詢,並得到一個遊標從表或視圖沒有重複的行與以下架構:

KEY | TAG 1 | TAG 2 | ... | TAG n 
================================= 
    |  |  |  | 

並非所有鍵必須具有每個標籤的值,但是所有鍵CAN都具有值。

我不知道如何做到這一點。我甚至不知道從哪裏開始。

在我創建了存儲一些變量值,我知道會一直存在另一個表其間。

但我覺得這是低效的,因爲在任何時候我能有新的變量值「N」數字這就是爲什麼我想能夠創建我列出的模式的視圖或表。

回答

1

SQLite沒有透視功能;你必須分兩步做。

首先,獲得所有可能的標籤:

SELECT _id, Name 
FROM Tags 
ORDER BY Name; 

然後,使用返回的數據,建立一個查詢,查找每個鍵每個可能的標籤:

SELECT Key, 
     (SELECT Value 
     FROM Values 
     WHERE Key_ID = Keys._id 
      AND Tag_ID = 111 
     ) AS Tag_111, 
     (SELECT Value 
     FROM Values 
     WHERE Key_ID = Keys._id 
      AND Tag_ID = 222 
     ) AS Tag_222, 
     ... 
FROM Keys; 
+0

所以基本上for循環內部選擇? (我會明天測試並更新) – clockwerk 2014-12-06 10:36:40

+0

完美運作。謝謝。 – clockwerk 2014-12-08 17:44:25