2

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

在 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.23s)是将两列都放在一个表中,但这很浪费,因为我有多个版本的 TABLE2 共享相同的时间戳。

4

1 回答 1

0

SQLite 支持UNION ALL.

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

使用 UNION ALL 运算符创建的复合 SELECT 返回 UNION ALL 运算符左侧的 SELECT 中的所有行,以及右侧的 SELECT 中的所有行。UNION 运算符的工作方式与 UNION ALL 相同,只是从最终结果集中删除重复行。INTERSECT 运算符返回左右 SELECT 的结果的交集。EXCEPT 运算符返回由左侧 SELECT 返回的行的子集,而右侧 SELECT 也不返回这些行的子集。在返回结果集之前,从 INTERSECT 和 EXCEPT 运算符的结果中删除重复行。

于 2011-05-11T21:28:14.273 回答