2010-04-15 6 views
2

Je voudrais implémenter ou utiliser des fonctionnalités qui permettent de parcourir une table dans SQLite.Marcher dans une table SQLite

Si j'ai un tableau Products qui a 100k lignes, je voudrais peut-être ré-écrire 10k lignes à la fois. Quelque chose de similaire à la façon dont une page Web listerait les données et aurait un lien < Previous .. Next > pour parcourir les données.

Y a-t-il des instructions select qui peuvent rendre ceci simple? Je vois et j'ai essayé d'utiliser le ROWID en conjonction avec LIMIT qui semble correct si je ne commande pas les données.

// Cela semble fonctionner si vous ne commandez pas.

SELECT * FROM Products WHERE ROWID BETWEEN x AND y; 
+0

Et que se passe-t-il si vous commandez les lignes? –

+0

le ROWID s'il n'est pas explicitement spécifié est toujours disponible mais n'est pas considéré comme statique. Cela dit, le ROWID implicite sera déterminé par l'ordre dans lequel les lignes sont écrites physiquement dans la table. Donc, si la table a été stockée dans l'ordre par nom, et que je veux commander par QTY, le ROWID ne représentera pas l'ordre retourné mais le numéro de ROW implicite. – galford13x

+0

Vous devriez éviter d'utiliser un ROWID intégré autant que possible dans le travail SQL. Il ne fait pas vraiment partie du standard SQL, c'est un add-on qui n'est pas garanti sur la plupart des RDBMS. J'utiliserais une clause ORDER BY pour créer une commande à la place. J'ai trouvé que la plupart des requêtes peuvent être écrites sans compter sur un numéro de ligne implicite, avec un peu d'imagination. –

Répondre

3

Vous cherchez offset and limit? SQLite les supporte. Vous pouvez ensuite utiliser order by, que SQLite prend également en charge.

EDIT: Pour élaborer, vous pouvez faire quelque chose comme:

Select * from Products order by name limit 10000 offset 10000;

Ce va chercher la deuxième page de 10k de la table, triées par nom. Méfiez-vous des problèmes de performances lorsque vous traitez avec limite/offset et commandez par.

+0

Vous utiliseriez cette requête dans votre code, et transformeriez la valeur passée en offset en une valeur paramétrée que vous incrémenterez de 10k pour chaque segment d'enregistrements dont vous avez besoin. –

+0

Merci c'est exactement ce que je cherchais. – galford13x

+0

Merci d'avoir corrigé mon erreur mouton –