2009-09-15 4 views
2

누구나 볼 수있는 SQL Server 2008 동작을 설명 할 수 있습니까? 간단한 테이블 정의 감안할 때SQL Server 2008 : SELECT TOP을 사용하는 예기치 않은 결과

:

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 * 게시물의 순서와 comments_count DESC BY는"반환

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    

하지만 돌아갑니다 "comments_count DESC에 의해 TOP 3 * 게시물 FROM ORDER 선택" : 내가 기대하는 것처럼

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    
대신 행 ID 1, 2 returnsing의

3. comments_count 열로 정렬시

감사 닉

답변

15

ID 3 행과 4는 넥타이를 갖는다. 표준 SQL은 넥타이가 있거나 ORDER BY 절을 지정하지 않으면 정렬 순서를 결정하는 것이 공급 업체 구현에 달려 있다고 말합니다.

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

그것은 당신이 명시 적으로 다음 순서를 지정하지 않은 경우가 심지어 다른 일관성이 보장되지 않는다는 것을 언급도 아마 가치 :

난 당신이 특정 순서를 원하는 경우이 순서를 지정 제안 쿼리를 실행합니다. 다음에'ID'가'ORDER BY' 절에 포함되지 않으면 세 번째 행은'3'에서'7'까지의 ID 중 하나 일 수 있습니다. – LukeH

+0

@ 루케 : 당신이 방금 언급했다고 생각합니다. :-) –

+0

지워 줘서 고마워. 내 자신과 같이 DBA가 아닌 사람들 사이에 일반적인 오해가있는 것처럼 보입니다. –