2011-05-11 2 views
2

J'ai deux tables et j'ai besoin de sélectionner une colonne de chacune d'entre elles. Cela doit être fait dans une seule requête. La bonne nouvelle est que les deux colonnes sont ordonnées dans le bon sens et qu'elles contiennent toutes les deux le même nombre de lignes. Maintenant, je sais que je pourrais joindre les deux tables par rowid, mais c'est lent car il doit faire cette comparaison. Dans mon cas ce n'est pas nécessaire ... J'ai besoin de quelque chose de plus comme UNION ALL horizontal pour concaténer deux colonnes de même longueur.horizontal UNION ALL

Est-ce que quelque chose comme ça est possible dans SQLite 3?

Merci.

Tableau 1:

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

TABLE2:

| temperature | 
| 1000000000 | 
| 2000000000 | 

REQUIRED OUTPUT SELECT

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

QUERY:

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

Cela prend ~ 0.75s dans mon application de test. Quand je fais deux SELECT séparés et rejoins les sorties plus tard dans mon programme cela prend ~ 0.4s, mais ce n'est pas très pratique. Le moyen le plus rapide (~ 0.23s) est d'avoir les deux colonnes dans une table, mais c'est gaspilleur car j'ai plusieurs versions de TABLE2 qui partagent les mêmes horodatages.

+0

@mu est trop court Par horizontal, je veux dire "l'un à côté de l'autre" plutôt que "l'un sur l'autre". J'ai besoin de deux colonnes courtes dans le jeu de résultats au lieu d'une longue ... – Petr

+1

Cela ressemble exactement à une jointure standard et une indexation correcte devrait faire vite. –

+0

@mu est trop court rowid devrait toujours être indexé, mais il est encore beaucoup plus lent (50%) que deux SELECT séparés. – Petr

Répondre

0

SQLite supports UNION ALL.

Deux ou plusieurs instructions SELECT simples peuvent être reliés entre eux pour former un composé SELECT en utilisant l'UNION, UNION ALL , INTERSECT ou EXCEPT. Dans un SELECT composé, tous les SELECT constitutifs doivent retourner le même nombre de colonnes de résultat . Comme les composants d'un SELECT composé doivent être des instructions SELECT simples , ils ne doivent pas contenir les clauses ORDER BY ou LIMIT. ORDER BY et Les clauses LIMIT ne peuvent apparaître qu'à l'extrémité de l'ensemble du composé SELECT.

Composé SELECT créé à l'aide UNION ALL opérateur retourne toutes les lignes de la SELECT à gauche de l'UNION ALL opérateur, et toutes les lignes de la SELECT à droite de celui-ci. L'opérateur UNION fonctionne de la même manière que UNION ALL, sauf que les lignes dupliquées sont supprimées du jeu de résultats final. L'opérateur INTERSECT renvoie l'intersection des résultats des sélections gauche et droite . L'opérateur EXCEPT renvoie le sous-ensemble des lignes renvoyées par le SELECT gauche qui sont et qui ne sont pas retournées par la commande de droite. Les lignes en double sont supprimées à partir des résultats d'INTERSECT et SAUF opérateurs avant que l'ensemble de résultats soit renvoyé.

Questions connexes