SQLITE3:两个不相关的表与多行的联合

时间:2012-04-05 06:58:22

标签: sqlite union group-concat coalesce

我已经简化了这个问题,因此发布更容易。我坚持要添加与其他表无关的配置表。如果你想跳过看我真正的问题,请查看当前的最终输出和所需的最终输出。为方便起见,我最后有一个不工作的SQL解决方案。

请提前帮助和谢谢!

背景

基本上我有一个声明,它有8个内部连接来连接各种表数据。我最初有8个不同的查询,但在我的嵌入式计算机上,查询运行大约2-3秒,每个查询的总时间约为20-30秒。这太长了。大部分时间是交易设置和拆解;查询非常快。由于我希望在1-2秒的时间内完成数据,因此我决定将所有查询合并到一个查询中。不幸的是,表本身是外部数据库的副本,不能从嵌入式设备查询;我不愿意将此时的数据合并到一个表中。该设备只有python2.5和sqlite3,虽然我已经安装了sqlalchemy,我通常在我的代码中使用ORM。不幸的是,我无法在机器上生成更多二进制文件,但我可以根据自己的心愿编写尽可能多的python。

数据

表1:用户

name   | number | data
 --------------------------------
 alpha   | 12345 | special
 beta     | 54321 | special-er

表2(与表1无关):配置

name   | data
 --------------------------------
 lang  | eng
 big     | 24
 medium | 20
 small | 13

最终表输出我目前得到的内容:

name   | number | data          | config
 -----------------------------------------------
 alpha   | 12345 | special       | {null}
 beta     | 54321 | special-er  | {null}
 {null}    | {null}   | {null}           | lang:eng
 {null}    | {null}   | {null}           | big:24
 {null}    | {null}   | {null}           | medium:20
 {null}    | {null}   | {null}           | small:13

决赛桌输出我想要的内容:

name   | number | data          | config
 -----------------------------------------------
 alpha   | 12345 | special       | lang:eng, big:24, medium:20, small:13
 beta     | 54321 | special-er  | lang:eng, big:24, medium:20, small:13

当前(非工作)解决方案

这是我到目前为止所做的:

<!-- language: sql -->
SELECT *
FROM (
SELECT u.name as name
                 ,u.number as number
                ,u.data as data
                ,NULL as config
FROM users u
UNION
 SELECT NULL as name
                 ,NULL as number
                 ,NULL as data
                 ,c.name||":"||c.data as config
 FROM configurations c
 ) t

1 个答案:

答案 0 :(得分:0)

您是否可以在同一交易中将选择作为两个单独的语句发出?

我正在做类似的事情,我通过HTTP链接发送SQL并将数据发送回格式化为JSON。链接的延迟是1-2秒,因此发送多个请求就是正确的。在我的情况下,我发现我可以发出用分号分隔的选择调用,例如这样的事情可能有用:

SELECT *
FROM (
SELECT u.name as name
                 ,u.number as number
                ,u.data as data
                ,NULL as config
FROM users u; 

SELECT NULL as name
                ,NULL as number
                ,NULL as data
                ,c.name||":"||c.data as config
FROM configurations c
) t

注意:我刚刚用一个分号复制你用UNION取代的东西,第二次看起来可能不太正确,但希望你明白了。

我不确定你是否需要将它包装在BEGIN TRANSACTION ... END TRANSACTION中 - 我会在服务器上自动执行所有查询。我也使用CITE接口到SQLITE3,为每个行生成JSON表的回复函数回调函数。我没有区分每个查询的结果;它们都是相同的功能,所以这可能是使我的情况有效的神奇之处 - 如果每个查询的列数不同,它会产生有趣的结果。