2013-03-16 91 views
2

我需要一个查询,选择一堆条目,然后与这些条目选择一堆行成一行。下面显示了一个典型的条目,以及典型的结果需要的样子。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。 目前,我选择了statment像下面只返回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的第一个结果。

+0

应该如何计算结果?为什么'value2'和'value4'不显示? – 2013-03-16 10:07:28

+0

'表2通常可以为null,value3需要进入result2'。此时你应该问自己,你的数据库设计是否合适。这里缺乏简单的引发红旗。 – Tim 2013-03-16 10:21:06

+0

但是看看这个:IFNULL http://www.sqlite.org/lang_corefunc.html#ifnull – Tim 2013-03-16 10:23:37

回答

3

对于像这样的条件关系,您将有更容易的时间运行多个选择,或创建一个临时表,使用键分阶段填充它,然后对临时表进行最终选择。

看着result4,实际上你试图对表格中的数据进行非规范化处理,然后用条件逻辑对外部连接进行重新归一化处理,但这可能是可行的,但是会对'聪明'数据库开发如果遇到问题,您很可能会得到一个几乎不可能调试的查询。

我知道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的值来获得相同的结果。

+0

您好,我已经在'2 Tables'上应用了'InnerJoin',在'First Table'中的主键是'Second Table'中的外键。第二个表有3行与外键关联我已经设法rawquery,但不知道如何读取光标让说在第一个表中有1行,从一个查询中第二个表中有3行。 – 2015-02-09 10:43:51