2016-01-27 1 views
0

Je travaille sur cette table:Trier par colonne booléenne produisent des lignes en double lorsque la pagination dans le serveur SQL

Order by boolean column produce duplicate rows when paging in sql server

Quand faire la pagination en utilisant la colonne IsAdmin, le résultat contiendra des lignes en double. Ceci est ma requête:

SELECT [UserId],[IsAdmin],[Date] FROM [Groups].[GroupMembers] 
WHERE ([GroupId] = 5) 
ORDER BY [IsAdmin] DESC 
OFFSET 0 ROWS FETCH NEXT 6 ROWS ONLY 

Et la seconde requête:

SELECT [UserId],[IsAdmin],[Date] FROM [Groups].[GroupMembers] 
WHERE ([GroupId] =5)  
ORDER BY [IsAdmin] DESC 
OFFSET 6 ROWS FETCH NEXT 6 ROWS ONLY 

Le résultat pour les deux requêtes est:

Order by boolean column produce duplicate rows when paging in sql server

Mais si l'utilisateur la colonne Date, je reçois résultat sans doublon.

Ma question est la suivante: pourquoi utiliser des lignes booléennes en double?

+0

Il ne produit pas de lignes dupliquées. C'est une colonne inutile pour une commande par. Vous devez ajouter une autre colonne à votre commande par ou vous n'avez aucune idée de l'ordre dans lequel ils seront retournés. Il fera tout ce qu'il veut pour l'ordre à l'intérieur de chaque valeur de votre booléen. Peut-être que simplement ajouter UserId comme une deuxième colonne fonctionnerait? –

Répondre

3

Le problème est que votre commande par est non-déterministe. Comme il y a beaucoup de lignes où est Admin = 0, vous n'êtes pas garanti que les mêmes lignes seront sélectionnées à chaque fois.

Si vous changez votre requête à

SELECT [UserId],[IsAdmin],[Date] FROM [Groups].[GroupMembers] 
WHERE ([GroupId] = 5) 
ORDER BY [IsAdmin] DESC, [UserId] 

alors vous ne serez pas la même ligne apparaissant deux fois (en supposant que [UserId] est unique).

En fait, cela ne garantit toujours pas qu'une ligne n'apparaîtra pas deux fois. Si des lignes sont insérées entre les appels et que les nouvelles lignes sont apparues sur la page en cours, certaines des lignes affichées sur la page en cours seront affichées à nouveau sur la page suivante à mesure qu'elles ont été placées dans l'ordre.