горизонтальный союз все - PullRequest
2 голосов
/ 12 мая 2011

У меня есть две таблицы, и мне нужно выбрать один столбец из каждой из них. Это должно быть сделано в одном запросе. Хорошей новостью является то, что два столбца расположены в правильном порядке, и они содержат одинаковое количество строк. Теперь я знаю, что могу присоединиться к двум таблицам по rowid, но это происходит медленно, так как для этого требуется сравнение. В моем случае это не нужно ... Мне нужно что-то более похожее на горизонтальный UNION ALL, чтобы объединить два столбца одинаковой длины.

Возможно ли что-нибудь подобное в SQLite 3?

Спасибо.

TABLE1:

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

ТАБЛИЦА 2:

| temperature |
| 1000000000  |
| 2000000000  |

ТРЕБУЕМЫЙ ВЫБОР ВЫХОДА

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

QUERY

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

В моем тестовом приложении это занимает ~ 0,75 с. Когда я делаю два отдельных SELECT и присоединяюсь к выходам позже в моей программе, это занимает ~ 0,4 с, но это не очень удобно. Самый быстрый способ (~ 0,23 с) состоит в том, чтобы оба столбца были в одной таблице, но это расточительно, поскольку у меня есть несколько версий TABLE2, которые имеют одинаковые временные метки.

1 Ответ

0 голосов
/ 12 мая 2011

SQLite поддерживает UNION ALL.

Два или более простых оператора SELECT могут быть соединены вместе для формирования составного SELECT с использованием оператора UNION, UNION ALL, INTERSECT или EXCEPT,В составном SELECT все составляющие SELECT должны возвращать одинаковое количество столбцов результата.Поскольку компоненты составного SELECT должны быть простыми инструкциями SELECT, они могут не содержать предложений ORDER BY или LIMIT.Предложения ORDER BY и LIMIT могут появляться только в конце всего составного оператора SELECT.

Составной оператор SELECT, созданный с помощью оператора UNION ALL, возвращает все строки из SELECT слева от оператора UNION ALL и всеряды из SELECT справа от него.Оператор UNION работает так же, как и UNION ALL, за исключением того, что повторяющиеся строки удаляются из окончательного набора результатов.Оператор INTERSECT возвращает пересечение результатов левого и правого SELECT.Оператор EXCEPT возвращает подмножество строк, возвращаемых левым SELECT, которые также не возвращаются правым SELECT.Повторяющиеся строки удаляются из результатов операторов INTERSECT и EXCEPT до возврата набора результатов.

...