1

我已经简化了这个问题,所以更容易发布。我坚持添加与其他表没有任何关系的配置表。如果您宁愿跳过查看我真正的问题是什么,请查看当前的最终输出和所需的最终输出。为方便起见,最后我有一个不工作的 SQL 解决方案。

请提前帮助和感谢!

背景

基本上我有一个语句,它有 8 个内部连接来连接各种表数据。我最初有 8 个不同的查询,但在我的嵌入式机器上,每个查询运行大约 2-3 秒,总时间约为 20-30 秒。这太长了。大部分时间是交易的建立和拆除;查询非常快。由于我希望在 1-2 秒的时间范围内获得数据,因此我决定将所有查询合并到一个查询中。不幸的是,这些表本身是无法从嵌入式设备查询的外部数据库的副本。我不愿意将此时的数据合并到一个表中。该设备只有 python2.5 和 sqlite3,虽然我已经安装了 sqlalchemy 并且我通常在我的代码中使用 ORM。很遗憾,

数据

表 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
4

1 回答 1

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-我会在服务器上为所有查询自动执行此操作。我还在使用 SQLITE3 的 C 接口,为每一行获取一个函数的回调,在该函数中我为回复生成 JSON 表。我不区分每个查询的结果;它们都使用相同的功能,所以这可能是在我的情况下使它工作的魔力 - 如果每个查询没有相同数量的列,它会产生有趣的结果。

于 2012-10-12T04:48:25.097 回答