2010-08-10 3 views
7

내가 선택한 테이블에서 이상한 결과가 나타납니다. 내가 같이 다음과 같은 SQL이있는 경우, 이제Sql SELECT TOP 1

USERID TICKETSASSIGNED 

1   0 
100  0 
101  0 
102  0 
103  0 

:

SELECT TOP 1 USERID 
    FROM TABLEX 
    ORDER BY TICKETSASSIGNED 

내가 얻을 기대하는 결과는 "1"하지만 대부분의 모든 시간을 내가지고있어 다음 표를 고려 "100", 두 번째 레코드. TICKETSASSIGNED 값은 모두 "0"이므로, 내가 주문하고있는 필드이므로 TOP 1이라고 생각하는 것이 무작위로 선택됩니다. 이 경우 "1"의 올바른 값을 얻으려면 USERID으로 주문해야합니다.

아이디어가 있으십니까?

+0

기본 키는 무엇인가를 반환 할 레코드 수를 지정하는 데 사용됩니다? 데이터는 실제로 표시되는 결과와 다른 저장 될 수 있습니다. –

답변

3

이 경우에 ORDER BY 절에 두 번째 열을 필요 :이없이

SELECT TOP 1 USERID 
FROM TABLEX 
ORDER BY TICKETSASSIGNED, USERID 

는, 예를 들어, 테이블의 물리적 위치에 의해 다음, 당신에게 TICKETASSIGNED에 의해 주문 레코드를 제공 아마입니다 대부분의 경우에 삽입 된 순서입니다.

0

TICKETSASSIGNED으로 주문하는 경우 모두 동일한 값을 사용하는 경우 특정 레코드를 맨 위에 반환해야 할 이유가 없습니다. 다음 필드로 USERID을 사용하여 최상위 필드를 가져 오려면 order by 절에 USERID을 추가해야합니다.

+0

빠른 답장을 보내 주셔서 감사합니다. 모두가 말합니다. –

8

결과는 "1"이지만 대부분 "100"이되는 두 번째 기록입니다. TICKETSASSINGED 값은 모두 "0"이기 때문에 주문하는 필드이기 때문에 TOP 1이라고 생각되는 것이 무작위로 선택됩니다. 이 경우 corredct 값 "1"을 얻으려면 USERID에서도 주문해야합니다.

이것은 모든 SQL에서 기본 동작입니다. ORDER BY 절이 없으면 순서 보증이 없으며이 경우 데이터베이스가 임의로 행을 선택하도록 관련 데이터로 정렬하지 않습니다. 당신이 TOP에 대한 문서 체크하면

ORDER BY TICKETSASSIGNED, USERID  
5

:

사용 TOP (Transact-SQL), 비고에서 특히 처음 두 단락을 명시 적으로 TOP이 행을 주문하지 않는 것을 말한다. 따라서, 자신이 부과 한 명령이 사용 된 명령입니다.

불행히도 주문이 불완전합니다. 때로는 원하는 것을 만들어내는 것입니다.

올바른 방법은 사용자가 알아 낸 것입니다. 사용자 ID를 통해서도 주문해야합니다.

0

선택 TOP 절은

SELECT * FROM Customers LIMIT 3; 


customerId  CustomerName 
--------------------------- 
1     abc 
2     xyz 
3     mno