我已经简化了这个问题,因此发布更容易。我坚持要添加与其他表无关的配置表。如果你想跳过看我真正的问题,请查看当前的最终输出和所需的最终输出。为方便起见,我最后有一个不工作的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
答案 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表的回复函数回调函数。我没有区分每个查询的结果;它们都是相同的功能,所以这可能是使我的情况有效的神奇之处 - 如果每个查询的列数不同,它会产生有趣的结果。