2011-05-11 59 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和 的結果中刪除重複行 除返回結果集 之前的操作符外。