web-dev-qa-db-fra.com

Numéros de ligne dans le résultat de la requête à l'aide de Microsoft Access

J'utilise toujours cette requête dans le serveur SQL pour obtenir le numéro de ligne dans une table:

SELECT *
FROM   (SELECT *,
               Row_number()
                 OVER(
                   ORDER BY [myidentitycolumn]) RowID
        FROM   mytable) sub
WHERE  rowid = 15  

Maintenant, je travaille dans Access 2010 et cela semble ne pas fonctionner. Existe-t-il un remplacement pour cette requête dans Access?

7
Arashdn

MS-Access ne prend pas en charge ROW_NUMBER (). Utilisez TOP 1:

SELECT TOP 1 *
FROM [MyTable]
ORDER BY [MyIdentityCOlumn]

Si vous avez besoin de la 15ème rangée, MS-Access n’a pas de moyen simple et intégré de procéder. Vous pouvez simuler le numéro d'avant en utilisant l'ordre inverse imbriqué pour obtenir ceci:

SELECT TOP 1 *
FROM (
  SELECT TOP 15 *
  FROM [MyTable]
  ORDER BY [MyIdentityColumn] ) t
ORDER BY [MyIdentityColumn] DESC
7
PinnyM

Une autre façon d'attribuer un numéro de ligne dans une requête consiste à utiliser la fonction DCount.

SELECT *, DCount("[ID]","[mytable]","[ID]<=" & [ID]) AS row_id
FROM [mytable]
WHERE row_id=15
9
Bobort

J'avais besoin des meilleurs résultats x de points par équipe.

Le classement ne résout pas ce problème quand il y a des résultats avec le même nombre de points . Il me faut donc une recordnumber

J'ai créé une fonction VBA dans Access pour créer une recordnumber qui réinitialise le changement d'identifiant.

Vous devez interroger cette requête avec où recordnumber <= x pour obtenir les points par équipe.

NB Access modifie le numéro d'enregistrement

  1. lorsque vous interrogez la requête filtrée sur le numéro d'enregistrement
  2. quand vous filtrez certains résultats
  3. quand vous changez l'ordre de tri

Ce n'est pas ce que je pensais que cela arriverait.

Ce problème a été résolu en utilisant une table temporaire et en enregistrant les clés recordnumbers et __ ou un champ supplémentaire dans la table.

SELECT ID, Points, RecordNumberOffId([ID}) AS Recordnumber
FROM Team ORDER BY ID ASC, Points DESC;

Il utilise 3 variables de niveau module pour se rappeler entre les appels

Dim PreviousID As Long
Dim PreviousRecordNumber As Long
Dim TimeLastID As Date

Public Function RecordNumberOffID(ID As Long) As Long 
'ID is sortgroup identity
'Reset if last call longer dan nn seconds in the past
If Time() - TimeLastID > 0.0003 Then '0,000277778 = 1 second
    PreviousID = 0
    PreviousRecordNumber = 0
End If
If ID <> PreviousID Then
    PreviousRecordNumber = 0
    PreviousID = ID
End If
PreviousRecordNumber = PreviousRecordNumber + 1
RecordNumberOffID = PreviousRecordNumber
TimeLastID = Time()
End Function
1
Jack Schneider