2014-12-06 112 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