Pourquoi il n'y a pas de "choisir" ou "sélectionner bas" dans SQL Server comme il est `select top"?

Je sais que cela peut sembler une question stupide, mais s'il vous plaît garder avec moi.
Dans SQL server, nous avons

SELECT TOP N ...

maintenant que nous pouvons obtenir les n premières lignes dans ordre croissant (par défaut), c'est cool. Si nous voulons que les enregistrements triés sur n'importe quelle autre colonne, nous venons de l'indiquer dans la clause order by, quelque chose comme ça...

SELECT TOP N ... ORDER BY [ColumnName]

Encore plus cool. Mais que faire si je veux le last ligne? Je viens de d'écrire quelque chose comme ceci...

SELECT TOP N ... ORDER BY [ColumnName] DESC

Mais il y a une légère préoccupation avec qui. Je l'ai dit préoccupation et pas question car il n'est pas vraiment un problème. De cette manière, j'ai pu obtenir la dernière ligne en fonction de cette colonne, mais si je veux la dernière ligne qui a été inséré. Je sais que sur SCOPE_IDENTITY, IDENT_CURRENT et @@IDENTITY, mais imaginez un heap (une table sans clustered index) sans aucune colonne d'identité et des accès multiples à partir de nombreux endroits (veuillez de ne pas aller dans cette trop comment et quand ces multiples opération se passe, cela ne concerne pas la chose principale). Donc, dans ce cas, il ne semble pas être un facile façon à trouver la ligne qui a été réellement inséré dernier. Certains pourraient répondre à ce que

Si vous faites un select * from [table] la dernière ligne affichée dans le sql de la fenêtre de résultat sera le dernier inséré.

À rien de penser à ce sujet, ce n'est pas réellement le cas, du moins pas toujours, et que vous pouvez toujours compter sur (msdn, veuillez lire la Advanced Scanning section).

De sorte que la question se résume à ceci, comme dans le titre lui-même. Pourquoi ne pas SQL Server ont un

SELECT LAST

ou dire

SELECT BOTTOM

ou quelque chose comme ça, où nous n'avons pas à spécifier le Order By et puis, elle donnerait l' dernier enregistrement inséré dans le tableau au moment de l'exécution de la requête (encore une fois je ne vais pas dans les détails sur comment ce résultat en cas de non validées à des lectures ou des lectures fantômes).

Mais si malgré tout, quelqu'un affirme que nous ne pouvons pas parler de ce sujet sans parler de ces niveaux de lecture, alors, pour eux, nous avons pu la faire se comporter de la même manière que TOP travail mais tout le contraire. Mais si votre argument est alors nous n'avons pas besoin que nous pouvons toujours faire

SELECT TOP N ... ORDER BY [ColumnName] DESC

alors je ne sais vraiment pas quoi dire ici. Je savoir nous pouvons le faire, mais il y a aucune relation basée sur la raison, ou sémantique basée sur la raison, ou pour une autre raison en raison de laquelle nous n'avons pas ou ne pouvez pas avoir ce SELECT LAST/BOTTOM. Je ne suis pas à la recherche de façon à ne Order By, je suis à la recherche de raisons pour lesquelles le faire ne l'avez pas ou ne pouvez pas l'avoir.

Supplémentaire
Je ne sais pas trop comment NOSQL fonctionne, mais j'ai travaillé (un peu) avec mongodb et elastic search, et, là aussi, ne semble pas être quelque chose de ce genre. Est la raison pour laquelle ils n'ont pas, c'est parce que personne n'a jamais eu avant, ou est-ce pour une raison pas plausible?

Mise à JOUR

Je ne pas besoin de savoir que j'ai besoin de spécifier l'ordre décroissant ou pas. Veuillez lire la question et de comprendre mon inquiétude avant de répondre ou de commenter. Je sais comment vais-je obtenir la dernière ligne. Ce n'est même pas la question, la question principale se résume à la pourquoi pas select last/bottom comme il l'homologue.

Mise à JOUR 2

Après les réponses de Vladimir et Pieter, je voulais juste mettre à jour que je sais que la commande n'est pas garanti si je fais un SELECT TOP sans ORDER BY. Je sais ce que j'ai écrit plus tôt dans la question pourrait faire une impression que je ne sais pas qui est le cas, mais si vous cherchez juste un plus bas, je ont donné un lien pour msdn et ont indiqué que la SELECT TOP sans ORDER BY ne garantit toute commande. Donc merci de ne pas l'ajouter à votre réponse que ma déclaration de mal, comme je l'ai déjà précisé que moi-même après une couple de lignes (où j'ai fourni le lien vers msdn).

  • Lorsque vous sélectionnez des données d'une table dans SQL, il n'y a pas de garantie de la commande, sauf si vous spécifiez ORDER BY. donc pour obtenir précis selon vos besoins, vous avez besoin de faire un TOP N avec ORDER BY somecol . Pour obtenir les N dernières lignes comme vous l'avez mentionné que vous venez de modifier l'ordre de ORDER BY somecol desc
  • Sir serait vous s'il vous plaît lire la question avant de commenter? Avez-vous encore rien lu ou elle?
  • SQL n'est pas intéressé à quand une ligne a été insérée, si vous vous avez besoin d'un horodatage sur la table.
  • Je l'ai fait et c'est le cœur du problème. Même si la table est un segment ou d'un index cluster a, lorsque vous faites un select sans une ordonnance il n'y a aucune garantie que les lignes seront dans un ordre spécifique (de l'ordre de l'insertion ou de quoi que ce soit).
  • connect.microsoft.com/SQLServer? 🙂
  • De la même manière vous ne pouvez pas faire un SELECT LAST/SELECT BOTTOM il n'y a pas de SELECT TOP qui obtient la première ligne insérée dans la façon dont vous parliez à l'aide de SELECT LAST... Vous avez besoin d'un horodatage
  • Je pense que l'OP est la recherche d'une sorte de fonction qui donne LAST ou BOTTOM enregistrement inséré et pour voir si il y a un besoin pour qu'il soit disponible dans SQL Server. Il ne plaide pas pour rien que vous êtes en train de dire, comme il l'a dit lui-même dans la question.
  • Uniquement les développeurs de Microsoft (ou les chefs de produit) peut répondre à pourquoi ils n'ont pas une telle fonctionnalité. Il est inutile de demander ici.
  • Comme @MarkSinkinson commentaire aludes, vous êtes allé de mal en début de votre question, vous vous référez à TOP N sans ORDER BY que "nous pouvons obtenir les n premières lignes dans l'ordre croissant" - mais ce n'est pas le cas. Vous obtenez à n lignes. C'est tout. Vous n'êtes pas garanti qu'ils sont les n premières lignes. la première et la dernière ont pas de sens en SQL, à moins de fournir un ORDER BY.
  • le haut et le dernier est le même, ok?
  • J'ai besoin pour cela - je veux la liste les données dans l'ordre croissant (j'ai une commande par l') mais qui ne veulent pas montrer les 5 dernières lignes. Je suis à l'aide d'un système de communication où l'sélectionnez doit retourner les lignes de données à afficher, dans l'ordre souhaité. Si utile question (et apparemment pas de solution facile).

InformationsquelleAutor Razort4x | 2015-05-06