0
votes

Sélectionnez Top à l'aide de SQL Server renvoie une sortie différente de SELECT *

J'ai essayé d'obtenir Sélectionnez Top N code> à partir d'une base de données basée sur le format alphabétique et numérotation. La sortie doit être commandée par alphabet d'abord et numéro après cela.

Lorsque j'essaie d'obtenir toutes les données ( Sélectionnez * code>), je reçois la sortie correcte: p> xxx pré>

mais quand j'essaie de Sélectionnez TOP N CODE> (EX: TOP 5), je reçois une sortie différente que prévu (pas comme SELECT * à partir du tableau code>): p>

nocust | share
-------+--------
a522   | BBCA
b454   | BBCA
k007   | BBCA
p430   | BBCA
q797   | BBCA


0 commentaires

3 Réponses :


1
votes

Vous avez une commande très étrange par - il ne garantit que des entrées avec une lettre au début sont commandées avant celles qui ont un numéro au début - mais vous êtes pas < / forte> en train de commander par les valeurs elles-mêmes. Aucun code par signifie: il n'y a aucune garantie de la manière dont les lignes seront commandées - comme vous voyez ici.

Vous devez adapter votre commander par à : xxx

maintenant Vous commandez réellement par nocust - et maintenant, je suis à peu près sûr, les sorties sera identique


2 commentaires

Merci d'avoir répondu. J'ai essayé et cela a donné la bonne réponse. Mais quand je change le 'Concat (Partager, Nocust) <' ZZZZQ797 ', je reçois une fausse réponse (PS: Je sais que ce n'est pas une partie de la question, je vais éditer plus tard)


@Alvinchrisianto: C'est une question complète - mieux Demandez à une question nouvelle QUIMENT QUOI



1
votes

Votre commande par n'est pas un type stable; Il trie les données généreusement dans l'une des deux catégories mais ne spécifie pas suffisamment de détails sur la manière dont les éléments doivent ensuite être triés dans la catégorie. Cela signifie que dans le top 5 de la forme SQLServer est libre de choisir une stratégie d'accès aux données qui signifie qu'il peut facilement s'arrêter après avoir trouvé 5 lignes dont les données sont telles que le cas lorsque code> retourne 0

Supposons que vous avoir cette sortie à partir de SELECT * ... Commande par catégorie CODE> P>

Category, Thing
Animal, Cat
Animal, Dog
Animal, Goat
Vegetable, Potato
Vegetable, Turnip
Vegetable, Swede


1 commentaires

Merci pour la réponse, je suis la réponse de @marc_s et obtenez la bonne réponse, mais lorsque je change le 'Concat (Partager, Nocust) <' ZZZZQ797 ', j'ai une fausse réponse. Est-ce lié à ce que vous avez expliqué ci-dessus?



0
votes

J'essaie de répondre à cela dans une perspective différente.

Tout d'abord, il convient de préciser que optimiseur permet de planifier le meilleur plan possible .

Optimizer Select Index ou ne sélectionnez pas l'index de manière la plus rentable .

J'utilise la base de données aventure 2016 et production.product a 504 lignes. xxx

il trie les lignes comme prévu. xxx

Il trie les lignes comme prévu .

Si j'utilise la déclaration de cas dans l'ordre xxx

Il trie l'enregistrement comme prévu. Tous les lignes 504 sont un processus.

Si j'utilise moins de égal à 20% des lignes totales dans le haut comme xxx

Si j'utilise plus 20% des lignes totales dans le haut comme xxx

Il traitera toutes les lignes 504 et trier en conséquence.

Le résultat du tri est comme prévu.

dans tout le cas ci-dessus Scan d'index en cluster (ID de produit> est terminé. Dans cet exemple, [nom] et le produit de produit sont deux index différents non clusters non clusters .

mais il n'a pas été sélectionné.

vous peut faire cela, xxx


1 commentaires

Merci @kumarharsh, votre réponse obtenez les bonnes données identiques comme le résultat Marc_s. Le problème suivant est Stackoverflow.com/Questtions/58214109/get -Data-de-Select-to p pouvez-vous s'il vous plaît jeter un oeil sur cette question.