2009-09-15 6 views
2

Quelqu'un peut-il expliquer le comportement de SQL Server 2008 que je vois?SQL Server 2008: résultats inattendus à l'aide de SELECT TOP

Étant donné une définition simple de la table:

Column   Type   Nullability 
id (PK)   int   not null 
author_id  int   null 
title   varchar(255) not null 
body   varchar(MAX) not null 
type   varchar(255) null 
comments_count int   null 

"SELECT * FROM messages ORDER BY comments_count DESC" retourne:

id author_id title        comments_count 
--- ---------- ----------------------------------- -------------- 
1 1   Welcome to the weblog    2    
2 1   So I was thinking     1    
3 0   I don't have any comments   0    
4 1   sti comments      0    
5 1   sti me        0    
6 1   habtm sti test      0    
7 2   eager loading with OR'd conditions 0    

mais "SELECT TOP 3 * de messages ORDER BY comments_count DESC" retours :

id author_id title        comments_count 
--- ---------- ----------------------------------- -------------- 
1 1   Welcome to the weblog    2    
2 1   So I was thinking     1    
4 1   sti comments      0    

au lieu de renvoyer les ID de ligne 1, 2 et 3 comme je m'attendais.

Merci Nick

Répondre

15

Les lignes avec id 3 et 4 ont un lien lorsque commandé par la colonne comments_count. SQL standard dit que c'est à l'implémentation du fournisseur de déterminer l'ordre de tri s'il y a un lien ou si vous ne spécifiez aucune clause ORDER BY.

Je vous suggère de spécifier l'ordre si vous voulez un certain ordre:

SELECT TOP 3 * FROM posts ORDER BY comments_count DESC, id ASC 
+1

Il est probablement utile de mentionner que si vous ne spécifiez pas explicitement un ordre alors il est même pas garanti d'être cohérent entre les différents exécute la requête. La prochaine fois, la troisième rangée pourrait être l'un des ID de '3' à' 7' si 'ID' n'est pas inclus dans la clause' ORDER BY'. – LukeH

+0

@Luke: Je pense que vous venez de le mentionner. :-) –

+0

Merci d'avoir éclairci ça. On dirait une idée fausse commune parmi les personnes non-DBA comme moi. –

Questions connexes