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:两个不相关的表与多行的联合的主要内容,如果未能解决你的问题,请参考以下文章

4. SQL — 表的联合

求高手帮忙看下sqlite3两个表联合查询语句怎么写。比如:

sqli-labs less54 GET -Challenge -Union -10 queries allowed -Variation1 (GET型 挑战 联合查询 只允许10次查询 变化1)(代

我需要向我的数据库询问从另一个应用程序收到的单词,我的表与多对多关系相关

使用联合查询将 bigquery 表与谷歌云 postgres 表合并

创建带“_”的表与创建不带“_”的表一样吗?