La sélection Énième Enregistrement dans une Requête SQL
J'ai une Requête SQL que je suis en cours d'exécution, mais je ne veux sélectionner une ligne spécifique. Par exemple, disons que ma question était:
Select * from Comments
Permet de dire que cela renvoie de 10 lignes, je ne sélectionnez le 8e retourné par cette requête. Je sais que je peux faire:
Select Top 5 * from Comments
Pour obtenir le top 5 des dossiers de la requête, mais je ne veux sélectionner un enregistrement précis, est-ce que je peux mettre dans cette requête pour le faire (similaires haut de page).
Grâce
jack
Quelle plateforme de base de données utilisez-vous? Sql2000? Sql2005? Oracle?
J'aurais du poser la question "pourquoi le 8e"? Est-il quelque chose de spécial au sujet de la 8e qui pourrait rendre plus facile pour sélectionner à l'aide d'un régulier de la clause where?
Non rien de spécial au sujet de la 8, c'est juste ce qui surgit dans ma tête. Je suis l'aide de SQL2005
J'aurais du poser la question "pourquoi le 8e"? Est-il quelque chose de spécial au sujet de la 8e qui pourrait rendre plus facile pour sélectionner à l'aide d'un régulier de la clause where?
Non rien de spécial au sujet de la 8, c'est juste ce qui surgit dans ma tête. Je suis l'aide de SQL2005
OriginalL'auteur Jack Mills | 2009-06-20
Vous devez vous connecter pour publier un commentaire.
C'est un classique de la question de l'entrevue.
Dans Ms SQL 2005+, vous pouvez utiliser le ROW_NUMBER() mot-clé et ont le Prédicat NUMERO_LIGNE = n
Dans SQL2000 vous pourriez faire quelque chose comme
Comme d'autres l'ont dit. Pourquoi avez-vous besoin de le 8e en particulier? De demander pour la énième où il y a un autre prédicat est souvent l'option préférable. Si vous êtes l'obtention de la nième fois tous si souvent, est-il besoin d'être optimisé pour les performances.
La meilleure façon de déterminer le "meilleur" dans ce type d'instance est de tester les techniques à l'encontre d'un ensemble de données de test qui correspond le mieux à l'équilibre de votre base de données (mais est de préférence plus grand, si votre jeu de données est petit pour le moment) et voir ce que le planificateur de requête répond à eux. Regardez la apparemment plan de requête, pour voir si rien de méchant, comme des analyses de la table commencent à tourner jusqu'où ils ne sont pas dans les autres méthodes, et aussi regarder les résultats provenant du générateur de profils SQL pour voir si les techniques diffèrent considérablement dans le CPU ou de la page charge en lecture pour d'autres raisons.
que SQL2K requête ne fait pas ce que vous pensez que cela fonctionne.
SQL 2000 réponse est simplement faux. Voir Degan réponse
OriginalL'auteur Johnno Nolan
Comment sur
C'est très inefficace en raison des deux sélections.
OriginalL'auteur Degan
Tout d'abord, il faut vous dire, qui SGBD que vous utilisez.
Seconde, vous devriez réfléchir à ce que vous essayez d'accomplir. Bases de données relationnelles sont à base de jeu. En général, l'ordre des éléments dans un ensemble n'a pas d'importance. Vous aurez envie de demander pourquoi c'est important dans ce cas, puis voir si il ya une meilleure façon d'intégrer le concept d'ordre dans la requête elle-même.
Par exemple, dans SQL Server 2005 (et d'autres SGBDR), vous pouvez utiliser la fonction ROW_NUMBER fonction pour assigner un numéro séquentiel pour chaque ligne retournée, sur la base des critères que vous spécifiez. Vous pouvez ensuite sélectionner les lignes basé sur le numéro de ligne. Exemple de Livres en Ligne:
Je suppose que les commentaires ci-dessus, le sens lorsque la N-est dans le bas de la fourchette de nombre d'enregistrements sélectionnés. par exemple, si je veux des enregistrements entre 50 à 60 de 10 000 enregistrements.
Je pense que vous devriez l'essayer et de trouver, en regardant le plan d'exécution. SQL Server est capable de s'apercevoir que la sélection externe comprend un test sur la valeur de la fonction ROW_NUMBER dans le CTE. C'est tout à fait possible qu'il ne sera pas seulement de sélectionner tous les SalesOrderHeader lignes et seulement ensuite filtrer. Vous devriez essayer et découvrir.
Je n'ai pas de SQL Server installé sur ma machine. Donc, je ne peux pas l'essayer. Désolé à ce sujet.
OriginalL'auteur John Saunders
OFFSET est une bonne chose pour MySQL
OriginalL'auteur Ben Hughes
Pour SQL Server 2005:
Cela ne fonctionne pas - vous ne pouvez pas faire référence au rang colonne, sauf si vous la placez dans une table dérivée ou une CTE - comme ceci: SELECT * from (SELECT rank() OVER (ORDER BY c.sujet, c.la date) QUE le rang de c.sujet, c.date DE commentaires c) un OÙ un.rang = 8
OriginalL'auteur rein
Bien, en T-SQL (le dialecte SQL Server), vous pouvez effectuer les opérations suivantes:
Cette façon, vous obtenez la 8e enregistrement.
OriginalL'auteur Paulo Santos
J'ai lu la question & vos commentaires sur vous voulez les 3 prochains commentaires de blog etc.
Comment vos tables structurés?
Supposons que vous avez un blog Id & commentaire Id est généré dans l'ordre croissant pour chaque billet de blog, vous pouvez faire une sélection basée sur le courant Id.
par exemple, si le blogpostId = 101, vous obtenez le top 3 des commentaires afin posté par Id. Maintenant, disons que vous voulez obtenir les 3 commentaires - vous pouvez effectuer une sélection OÙ commentId entre le dernier commentaire de l'id indiqué À l'observation id - 3
Mais tout cela dépend de la façon dont vos tables sont définies.
OriginalL'auteur shahkalpesh
Dans SQL 2000, où vous n'avez pas de fonction ROW_NUMBER() vous pouvez utiliser une solution de contournement, comme ceci:
Merci. Mieux maintenant.
Maladroite. Utilisez ceci: SELECT TOP 1 ... à PARTIR de (SELECT TOP 8 ... ORDER BY x ASC) foo COMMANDE PAR x DESC
Pas toujours, vous avez une colonne pour effectuer le tri et de son inverse.
c'est mieux: avec PAS d'ORDRE appliqué
OriginalL'auteur AlejandroR
OriginalL'auteur Harendra Negi
De la SÉLECTIONNEZ une référence, l'utilisation de la LIMITE de mots clés:
Note: c'est pour MySQL, SQL moteurs peuvent avoir un autre mot clé.
OriginalL'auteur Ben S
OriginalL'auteur Vinothkumar Savaridoss
essayer Cette
Supposons , Nous voulons sélectionner la 5ème ligne de WC_Video Table
Et
OriginalL'auteur Pravin Kumar Mishra