2011-05-11 60 views
2

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

在SQLite 3中有这样的可能吗?

谢谢。

TABLE1:

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

TABLE2:

| temperature | 
| 1000000000 | 
| 2000000000 | 

REQUIRED选择输出

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

QUERY

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

这需要〜0.75s在我的测试应用程序。当我做两个单独的SELECT并在我的程序中稍后加入输出时,它需要〜0.4s,但它不是很方便。最快的方法(〜0.23s)是在一个表中同时存在两列,但由于我有多个共享相同时间戳的TABLE2版本,这是浪费。

+0

@mu太短我的意思是“彼此相邻”而不是“在彼此之上”。我需要两个结果集中的短列,而不是一个长... – Petr 2011-05-11 22:08:28

+1

这听起来就像一个标准的连接,适当的索引应该快速。 – 2011-05-11 22:15:25

+0

@mu太短rowid应该总是被索引,但是它比两个单独的SELECT还要慢(50%)。 – Petr 2011-05-11 23:08:42

回答

0

SQLite supports UNION ALL

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

的化合物,使用UNION ALL 运算符返回从 的SELECT到它的右边的所有从 行的SELECT到UNION ALL 操作者的左侧,并且所有行SELECT创建。 UNION运算符的工作方式与 UNION ALL的工作方式相同,但重复行 已从最终结果集中删除。 INTERSECT运算符返回 左侧和右侧SELECT的结果的交集 。除了 运算符之外,运算符返回由左边SELECT返回的行 的子集,而 也不会由右边的 SELECT返回。从INTERSECT和 的结果中删除重复行 除返回结果集 之前的操作符外。