Sqlite 将多行选择为单行

Posted

技术标签:

【中文标题】Sqlite 将多行选择为单行【英文标题】:Sqlite select multiple rows into a single row 【发布时间】:2013-03-16 09:02:32 【问题描述】:

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

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 的第一个结果。

【问题讨论】:

应该如何计算结果?为什么value2value4 没有出现? Table 2 can often be null, value3 would need to go into result2。在这一点上,您应该问自己您的数据库设计是否是好的。这里缺乏简单性会引发危险信号。 但是看看这个:IFNULL sqlite.org/lang_corefunc.html#ifnull 蒂姆,我知道数据库设计问题,我可以简单地解决这样的问题的唯一方法是复制数据,所以这可能是一个解决方案。 【参考方案1】:

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

查看结果 4,实际上您是在尝试使用带有条件逻辑的外部连接对表中的数据进行非规范化然后重新规范化,这可能是可行的,但会违背“明智”数据库开发的原则,并且您如果遇到问题,最终可能会得到一个几乎无法调试的查询。

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

【讨论】:

您好,我在2 Tables 上应用了InnerJoin 1 列,这是First Table 中的主键在Second Table 中是外来的。第二个表有 3 行与我设法进行 rawquery 的外键关联,但不知道如何读取游标,比如说在一个查询中从第一个表中获取 1 行,从第二个表中获取 3 行。

以上是关于Sqlite 将多行选择为单行的主要内容,如果未能解决你的问题,请参考以下文章

SQLITE:如果它们共享一列,则将行合并为单行

从 SQLite 数据库中检索特定项目

13.4 使用SQLite.NET.Async-PCL访问SQLite数据库

使用内爆在sqlite中插入多行[重复]

SQLite:如何将查询结果保存为 CSV 文件?

如何将python连接到sqlite3并一次填充多行