SQLite boucle déclarations?
Est-il en boucle les déclarations dans SQLite, comme FOR .. in .. LOOP
ou quelque chose comme ça? J'ai deux colonnes StartRange, EndRange
et j'ai besoin d'insérer toute la séquence dans une autre table. Donc, si StartRange
est 1 et EndRange
est de 3, il est nécessaire de faire trois insère la valeur contient 1, 2, 3
.
J'ai peur que vous allez avoir besoin d'écrire du code impératif de le faire, le SQL est généralement un langage déclaratif et seulement ses extensions (comme le T-SQL, SQL/PL etc.) support de contrôle de flux des structures comme les boucles. Si ce devrait être facile, cependant, de procéder à l'insertion dans un seul terme en utilisant SQLite transactions.
Perl/Python/Ruby-script-de-la-rescousse! 🙂
Cela devrait-il être déplacé à dba.stackexchange.com ?
Non, je crois que cette question est sur le sujet depuis qu'il est fondamentalement demande "Comment puis-je écrire un peu de code pour faire X, en utilisant un langage?" Comme on peut le voir à partir de la accepté de répondre, la solution est code.
Perl/Python/Ruby-script-de-la-rescousse! 🙂
Cela devrait-il être déplacé à dba.stackexchange.com ?
Non, je crois que cette question est sur le sujet depuis qu'il est fondamentalement demande "Comment puis-je écrire un peu de code pour faire X, en utilisant un langage?" Comme on peut le voir à partir de la accepté de répondre, la solution est code.
OriginalL'auteur kseen | 2011-09-10
Vous devez vous connecter pour publier un commentaire.
Vous pouvez faire ce genre de chose tout de SQL si vous avez une table supplémentaire qui contient tous les nombres entiers dont vous avez besoin.
Supposons que votre
StartRange
etEndRange
comprise entre un et dix et vous avez un tableau comme ceci:Ce tableau contient tous les nombres entiers dont vous avez besoin (un sur dix).
Alors si vous aussi, vous avez ceci:
Vous pouvez faire votre Insère dans
target
avec une jointure:Le résultat est le suivant:
Bien sûr, votre véritable
t
aurait plus de lignes de sorte que vous voudriez une clause where à la limite de la ligne det
vous regardez.Des choses similaires se fait souvent avec des dates (calendrier "tables").
Donc, si vos plages sont de petite taille (pour une définition de petit) puis générer votre
ints
table une fois, ajouter un index, et d'utiliser la technique ci-dessus pour faire tous les INSERTs à l'intérieur de la base de données. D'autres bases de données ont leurs propres moyens (tels que PostgreSQL estgenerate_series
) pour faire ce genre de chose sans avoir besoin d'un expliciteints
table, mais SQLite est (volontairement) limitée.SQL est généralement à base de jeu si les boucles ne sont pas naturelles. Ce qui est naturel est de construire des ensembles en décrivant ce que vous avez besoin. Otoh, que, parfois, les actes contre nature sont nécessaires et raisonnables.
Je ne sais pas si cela a un sens pour votre application, j'ai juste pensé que je voudrais vous montrer comment il peut être fait. Si cette approche ne fait pas de sens dans votre cas, alors vous pouvez générer un tas d'états d'INSERTION à l'extérieur de la base de données.
Faites-vous référence à
rowid
?Oui. (et avec votre nom, c'est toujours trop court)
Mais que faire si il y a des lacunes dans la
rowid
s? Ou si elles ne correspondent pas à la plage désirée?C'est vrai, à l'explicite distance, il semble préférable d'avoir explicite les numéros de ligne. Mais kseen besoin de vous soucier de la possibilité de lacunes.
OriginalL'auteur
Vous pouvez faire des boucles dans SQL avec récursive des déclencheurs. À l'aide de mu est trop court's schéma
nous avons besoin pour activer les déclencheurs récursifs dans SQLite:
Faire un temporaire de déclenchement de la boucle jusqu'à la fin de la plage:
Coup de pied hors tension:
OriginalL'auteur
Apparemment, la construction de boucle dans SQLite est le AVEC RÉCURSIVE clause.
Que la documentation lien a nombre d'échantillon à dix code, un ensemble de Mandelbrot traceur, et un puzzle de Sudoku solver, le tout en pur SQL.
Voici une requête SQLite qui calcule la suite de Fibonacci pour vous donner une idée:
Et voici un Crible d'Eratosthène:
OriginalL'auteur