我需要一个查询来选择一堆条目,然后用这些条目选择一堆行到一行。下面显示了一个典型的条目,以及典型结果需要的样子。
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的第一个结果。
答案 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的值即可获得相同的结果。