水平 UNION ALL

Posted

技术标签:

【中文标题】水平 UNION ALL【英文标题】:horizontal UNION ALL 【发布时间】:2011-05-11 21:24:42 【问题描述】:

我有两个表,我需要从每个表中选择一列。 这必须在单个查询中完成。 好消息是这两列的排序方式正确,并且它们都包含相同数量的行。 现在,我知道我可以通过 rowid 加入这两个表,但它很慢,因为它必须进行比较。在我的情况下,没有必要......我需要更像 的东西来连接两列长度相等。

SQLite 3 中是否有类似的可能?

谢谢。

表 1:

| timestamp | FIELD1 | FIELD2 | ...
| 12345678  | 000000 | 000000 | ...
| 00154789  | 000000 | 000000 | ...

表 2:

| temperature |
| 1000000000  |
| 2000000000  |

必需的选择输出

| timestamp | temperature |
| 12345678  | 1000000000  |
| 00154789  | 2000000000  |

查询

SELECT timestamp, temperature
FROM TABLE1 INNER JOIN TABLE2 ON TABLE1.rowid = TABLE2.rowid;

这在我的测试应用程序中大约需要 0.75 秒。当我稍后在我的程序中执行两个单独的 SELECT 并加入输出时,大约需要 0.4 秒,但这不是很方便。最快的方法(约 0.23 秒)是将两列放在一个表中,但这很浪费,因为我有多个版本的 TABLE2 共享相同的时间戳

【问题讨论】:

@mu 太短 水平方向的意思是“彼此相邻”,而不是“在彼此之上”。我需要结果集中的两个短列而不是一个长列... 这听起来就像一个标准的连接,正确的索引应该会更快。 @mu 太短 rowid 应该总是被索引,但它仍然比两个单独的 SELECT 慢(50%)。 【参考方案1】:

SQLite supports UNION ALL.

两个或多个简单的 SELECT 语句 可以连接在一起形成一个 使用 UNION、UNION 的复合 SELECT ALL、INTERSECT 或 EXCEPT 运算符。在 一个复合 SELECT,所有的成分 SELECT 必须返回相同数量的 结果列。作为一个组件 复合 SELECT 必须是简单 SELECT 语句,它们可能不包含 ORDER BY 或 LIMIT 子句。 ORDER BY 和 LIMIT 子句只能出现在 整个复合 SELECT 的结尾。

使用 UNION 创建的复合 SELECT ALL 运算符返回所有行 UNION 左侧的 SELECT ALL 运算符,以及来自的所有行 SELECT 在它的右边。这 UNION 运算符的工作方式与 UNION ALL,除了重复的行 从最终结果集中删除。 INTERSECT 运算符返回 结果的交集 左右选择。除了 运算符返回行的子集 由左 SELECT 返回的 也不是由右手返回 选择。重复行被删除 从 INTERSECT 的结果和 结果集之前的 EXCEPT 运算符 被退回。

【讨论】:

以上是关于水平 UNION ALL的主要内容,如果未能解决你的问题,请参考以下文章

MySQL单机优化---分表分区分库

绝对定位下的水平居中实现

predict.lm() 在测试数据中具有未知因子水平

Union all和Union差别

SwiftUI:水平滚动视图我能够上下拉图像

union与union all的区别