使用表行中的表名连接多个SQL表

时间:2012-07-24 13:37:50

标签: android sqlite

我正在使用SQLite,我不确定是否可以这样做。考虑一下我有这些表:

======>Table: Total_Table

_id    Name   Ingredients

0     "A"     "table_a"<br>
1     "B"     "table_b"

=====>Table: table_a

 _id    Name

 0      "a_1" <br>
 1      "a_2"

=====>Table: table_b

_id    Name
0      "a_1" <br>

Total_Table行中引用的表具有不同的行数,并在Total_Table中添加行时创建。

目前,我需要构建一个将从Total_Table返回行的查询。

但是会搜索Ingredients表的条目。

例如,如果我要查找Total_TableIngredients表中 a_1 的所有行,它会从{{返回0,1行1}}。

目前,我这样做是通过查询Total_Table的所有行,然后遍历这些条目并分别查询每个表,然后形成一个数组。

这非常糟糕,因为我正在查看的表格相对较大,并且会影响性​​能。

有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:1)

我认为通过稍微不同的数据库架构,您会发现这更容易。 SQLite是一个关系数据库,所以让我们尝试相应地存储东西。基本上,我们将有3个表,一个用于Total_Table,一个用于您的成分,一个表用于映射Total_Table中哪个实例的成分。

逻辑上,它看起来像这样:

Table: Total_Table

_id    Name
0      "A"
1      "B"

Table: Ingredients

_id    Name

0      "a_1"
1      "a_2"

Table: Total_Ingredients

total_id  ingredient_id
0         0
0         1
1         0

这里的好处很多。首先,您不需要在运行时创建任何表。无论您拥有多少Total_Table个条目,您都需要3个表。其次,它很容易查询。第三,您不会在修订后的架构中的任何位置复制名称a_1(这称为Database normalization)。

然后,您的查询将如下所示。请注意,在示例数据中,a_1的id为0,我们将其用于查询目的。

select _id, Name from Total_Table where id in 
  (select total_id from Total_Ingredients where ingredient_id = 0)

更新:如果我理解正确,您的其他查询非常相似。因此,您需要具有部分或全部给定成分的食谱。假设您的子集包含此示例的ID 1,5和7,唯一的更改是使用in子句。

select _id, Name from Total_Table where id in 
  (select distinct total_id from Total_Ingredients where ingredient_id in (1,5,7)) 

答案 1 :(得分:0)

尝试将您的表组合为一个(最好是视图)然后再查看。或者运行您的查询,如下所示:

String name = "bla bla bla";

"SELECT DISTINCT _id FROM Total_Table WHERE _id IN
     ((SELECT _id FROM table_a WHERE Name='" + name + "') UNION ALL
      (SELECT _id FROM table_b WHERE Name='" + name + "'))"