SQLITE3:两个不相关的表与多行的联合
Posted
技术标签:
【中文标题】SQLITE3:两个不相关的表与多行的联合【英文标题】:SQLITE3: Union of two unrelated tables with multilines 【发布时间】:2012-04-18 22:03:09 【问题描述】:我已经简化了这个问题,所以更容易发布。我坚持添加与其他表没有任何关系的配置表。如果您宁愿跳过查看我真正的问题是什么,请查看当前的最终输出和所需的最终输出。为方便起见,最后我有一个不起作用的 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】:您可以在同一事务中将选择作为两个单独的语句发出吗?
我正在做类似的事情,我通过 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 表。我不区分每个查询的结果;他们都去同一个函数,所以这可能是在我的例子中使这个工作的魔力 - 如果每个查询没有相同数量的列,它会产生有趣的结果。
【讨论】:
我正在使用几代前的 ARM 处理器开发嵌入式设备(阅读:非常慢)。两次选择对我的应用程序来说太长了。以上是关于SQLITE3:两个不相关的表与多行的联合的主要内容,如果未能解决你的问题,请参考以下文章
求高手帮忙看下sqlite3两个表联合查询语句怎么写。比如:
sqli-labs less54 GET -Challenge -Union -10 queries allowed -Variation1 (GET型 挑战 联合查询 只允许10次查询 变化1)(代
我需要向我的数据库询问从另一个应用程序收到的单词,我的表与多对多关系相关