Sqlite选择多行成为一行

时间:2013-03-16 09:02:32

标签: android sqlite

我需要一个查询来选择一堆条目,然后用这些条目选择一堆行到一行。下面显示了一个典型的条目,以及典型结果需要的样子。

table1
id
-------
3     

table2
id      value       table1
--------------------------
5       value1      3
6       value2      3

table3
id      value       table1
-------------------------
9       value3      3
10      value4      3

table4
id      table1
---------------
14      3
15      3

table5
id      value       table4
-------------------------------
19      value5      14
20      value6      14
21      value7      15


result
result1 result2     result3     result4
------------------------------------------------------
3       value1      value3      value5, value6; value7

只需要表1和表2的第一个结果。表2通常可以为null,value3需要进入result2。 目前我选择了每个条目,其中包含下面仅返回result1的规则,然后对于每个条目,我会对每个结果进行单独查询

SELECT DISTINCT id FROM (
    -complicated select in here
) AS temp;

然后为每个id分别执行:

SELECT value FROM table2 WHERE table1 = id LIMIT 1;

SELECT value FROM table3 WHERE table1 = id LIMIT 1;

SELECT value, table4.id FROM table4, table5 WHERE table4.id = table5.table4 AND table1 = id;

并使用代码将其格式化为类似于结果表的内容。

问题是只有第一个查询是在后台线程上完成的,而其余的则是在UI线程上完成的。我想在一个查询中完成所有操作,但是我遇到了table4到单行的麻烦,只选择了table2和table3的第一个结果。

1 个答案:

答案 0 :(得分:3)

对于这样的条件关系,您可以更轻松地运行多个选择,或创建临时表,分阶段填充键,然后对临时表进行最终选择。

查看result4,实际上你试图使用带有条件逻辑的外连接来对表中的数据进行非规范化然后重新规范化,这可能是可行的,但是它会违背“明智的”#39 ;数据库开发,如果遇到问题,你很可能会得到一个几乎无法调试的查询。

我知道sqlite是在轻量级环境中使用的SQL标准的简单实现,因此我不确定SQL在遇到麻烦之前有多复杂。

我并不完全清楚你想要实现的目标,但是解决方法可能是使用如下的几个UNION语句:

SELECT DISTINCT source, id FROM (
    SELECT table2.table1 AS table1, 'table2' AS source, value AS id FROM table2 
    UNION
    SELECT table3.table1, 'table3', value FROM table3 
    UNION
    SELECT table4.table1, 'table5', value FROM table5, table4 
    WHERE table4.id = table5.table4)
WHERE table1 = 3;

然后你会得到这样的结果:

source    | id
-----------------------
table2    | value1
table3    | value3
table4    | value5
table4    | value6
table4    | value7

您的另一个选择是创建一个包含所有联合的视图(以及所有三个列,而不仅仅是上面选择的两个),然后您只需选择table1的值即可获得相同的结果。