2010-11-27 10 views
1

J'ai une table dérivée qui contient le nombre de jointures, j'essaye d'implémenter la pagination mais le ROW_NUMBER() n'est pas séquentiel. Je pense que je sais pourquoi ce n'est pas séquentiel mais existe-t-il un moyen de le forcer à être séquentiel?ROW_NUMBER() à partir Table dérivée avec jointures n'est pas séquentielle?

SELECT [Results].[Row1], 
     [Results].[Row2], 
     [Results].[Row3], 
    FROM (
    SELECT [p].[Row1], 
      [p].[Row2], 
      [p].[Row3], 
      ROW_NUMBER() OVER (ORDER BY [p].[Id]) As RowNumber 
    FROM Table1 As [l] 
    JOIN Table2 As [p] ON [l].[fId] = [p].[Id] 
    JOIN Users As [u] ON [p].[fId] = [u].[Id] 
    JOIN Questions As [q] ON [p].[Id] = [q].[fId]) As Results 

J'apprécierais n'importe quelle aide, merci!

Répondre

1
with tempTable as (
    SELECT [Results].[Row1], 
      [Results].[Row2], 
      [Results].[Row3], 
     FROM (
     SELECT [p].[Row1], 
       [p].[Row2], 
       [p].[Row3], 
     FROM Table1 As [l] 
     JOIN Table2 As [p] ON [l].[fId] = [p].[Id] 
     JOIN Users As [u] ON [p].[fId] = [u].[Id] 
     JOIN Questions As [q] ON [p].[Id] = [q].[fId]) As Results 

    ) select ROW_NUMBER() OVER (ORDER BY something) As RowNumber, * from tempTable 
1

Pourquoi ne pas simplement faire un ORDER BY Results.RowNumber à la toute fin?

+0

Pour être honnête l'ordre par n'est pas pertinent pour moi, je ne comprends tout simplement pas pourquoi le ROW_NUMBER() n'est pas séquentiel? – Lukasz

+0

Par séquentiel, vous voulez dire ordonné, ou est-ce que je me méprends sur le terme? Si oui, c'est parce que vous n'avez pas spécifié comment la requête devrait être commandée; en fonction du plan de requête choisi par l'analyseur de requête (y compris l'utilisation de l'index, etc.), il est possible d'utiliser des opérations qui ne respectent pas la commande. 'ROW_NUMBER()' compte les lignes, et comme vous faites une jointure, vous pouvez avoir plusieurs lignes avec le même '[p]. [Id]' mais avec des numéros de lignes uniques. Utilisez 'RANK()' ou une autre fonction si vous ne le voulez pas, ou soyez plus précis sur la commande dans 'OVER (ORDER BY)'. – Lucero

+0

Non, désolé, ce que je veux dire par séquentiel est que le ROW_NUMBER() est 1, 2, 3, 4, 5 ... N contre 1, 23, 45, 67, 1345 ... N – Lukasz