SQL seleccionar o topo 1
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?
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
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.
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.
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.
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