SQL seleccionar o topo 1

Estou a receber resultados estranhos de uma mesa da qual estou a escolher. Considere o seguinte quadro:

USERID    TICKETSASSIGNED

1         0  
100       0  
101       0  
102       0  
103       0  

agora, se eu tiver o seguinte sql como em:

SELECT TOP 1 USERID  
  FROM TABLEX  
  ORDER BY TICKETSASSIGNED

o resultado que eu esperaria obter é "1", mas a maioria das vezes estou a conseguir" 100", o segundo disco. Uma vez que TICKETSASSIGNED os valores são todos "0", ele escolhe aleatoriamente qual ele acha que é o TOP 1, uma vez que este é o campo em que estou a encomendar. Para obter o valor correto de" 1 " Neste caso, eu também tive que pedir em USERID.

Qualquer ideias?

 7
sql
Author: rajadilipkolli, 2010-08-11

5 answers

O resultado que eu esperaria obter é "1", mas a maior parte do tempo eu estou obtendo" 100", o segundo disco. Uma vez que os valores de TICKETSASSINGED são todos "0", ele aleatoriamente escolhe qual ele acha que é o TOP 1, uma vez que este é o campo em que eu estou ordenando. Para obter o valor corredct de " 1 " Neste caso, eu tive que pedir também em USERID.

Este é o comportamento padrão em todos os SQL-não há garantia de ordem se não há ordem por cláusula, e neste caso você não está ordenando por dados pertinentes então a base de dados escolhe arbitrariamente uma linha.

Utilizar:

ORDER BY TICKETSASSIGNED, USERID    
 8
Author: OMG Ponies, 2010-08-10 21:33:28

Se verificar a documentação para TOP: TOP (Transact-SQL), especificamente os dois primeiros parágrafos sob observações, afirma explicitamente que TOP não ordena as linhas. Como tal, a ordem que você impôs a si mesmo é a que foi usada.

Infelizmente, o seu pedido está incompleto. Só acontece produzir o que queremos às vezes. A maneira correcta é exactamente o que descobriste, também precisas de pedir ao USERID.
 5
Author: Lasse Vågsæther Karlsen, 2010-08-10 21:33:41

Precisaria de uma segunda coluna na sua cláusula ORDER BY neste caso:

SELECT TOP 1 USERID  
FROM TABLEX  
ORDER BY TICKETSASSIGNED, USERID

Sem isso é provavelmente dando-lhe os registros ordenados por TICKETASSIGNED, em seguida, pela sua localização física na tabela, por exemplo, a ordem que eles foram inseridos na maioria dos casos.

 4
Author: Nick Craver, 2010-08-10 21:31:42

Se você está encomendando apenas por {[[0]} e todos eles têm valores iguais, não há nenhuma razão para que qualquer registro específico deve ser devolvido como o topo. Se você quiser obter o Top one usando USERID como o próximo campo para encomendar até, então sim, você deve apenas adicionar USERID à sua cláusula de ordem por.

 0
Author: rosscj2533, 2010-08-10 21:31:51

A cláusula de selecção de topo é usada para indicar o número de registos a devolver

SELECT * FROM Customers LIMIT 3;


customerId     CustomerName
---------------------------
1                 abc
2                 xyz
3                 mno
 0
Author: pradip kor, 2017-06-28 10:29:10