我正在使用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_Table
中Ingredients
表中 a_1 的所有行,它会从{{返回0,1
行1}}。
目前,我这样做是通过查询Total_Table
的所有行,然后遍历这些条目并分别查询每个表,然后形成一个数组。
这非常糟糕,因为我正在查看的表格相对较大,并且会影响性能。
有什么想法吗?谢谢!
答案 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 + "'))"