2009-05-25 7 views

Répondre

16

Sur les bases de données qui prennent en charge, vous pouvez utiliser ROW_NUMBER() à cet effet:

SELECT RowNr 
FROM (
    SELECT 
     ROW_NUMBER() OVER (ORDER BY mycolumn) AS RowNr, 
     mycolumn 
    FROM mytable 
) sub 
WHERE sub.mycolumn = 42 

L'exemple suppose que vous êtes à la recherche de clé primaire 42 :)

Le sous-requête est nécessaire parce que quelque chose comme:

SELECT 
    ROW_NUMBER() OVER (ORDER BY mycolumn) AS RowNr 
FROM mytable 
WHERE sub.mycolumn = 42 

Va toujours retourner 1; ROW_NUMBER() fonctionne après le WHERE, pour ainsi dire.

+0

Pourquoi la downvote? Ceci est correct et utile pour les moteurs de base de données supportant ROW_NUMBER (à quel point cela est rapide par rapport aux alternatives, comme d'habitude, nécessite une mesure spécifique sur une base de données donnée). –

+0

Ceci est une solution parfaitement valide pour SQL Server. –

+1

Je n'ai pas donné un downvote, mais fwiw l'OP n'a pas dit qu'il utilisait Microsoft SQL Server. Il pourrait l'être, mais il ne l'a pas dit ou n'a pas tagué sa question pour cela. –

0

Vous ne pouvez pas le dire sans sélectionner un sous-ensemble d'enregistrements. Si votre PK est de type entier, vous pouvez

select count(*) from mytable 
    where id <= 10 -- Record with ID 10 
    order by mycolumn asc 
+1

Cela retourne la position quand elle est commandée par id, la clause 'order by' n'a aucun effet. – Guffa

2

SQL ne fonctionne pas de cette façon. Il est basé sur un ensemble, ce qui signifie que la "position dans cette table de résultats" n'a aucun sens pour la base de données.

Vous pouvez garder une trace de la position lorsque vous mappez le ResultSet dans une collection d'objets ou lorsque vous passez en revue dessus.

+0

+1 excellente réponse. SQL Server est * NOT * comme dBase plus - pas plus "record + 1" ou tel. –

+0

Si la position n'a pas de sens, à quoi sert ORDER BY? Ou LIMIT, TOP et ROW_NUMBER? – Andomar

+0

LIMIT, TOP et ROW_NUMBER() ne font pas partie du langage SQL standard. –

15

Vous pouvez compter le nombre d'enregistrements où la valeur que vous triez sur une valeur inférieure à l'enregistrement que vous connaissez la valeur de clé de:

select count(*) 
from mytable 
where mycolumn < (select mycolumn from mytable where key = 42) 
+2

+1 Simple et ne dépend pas de ROW_NUMBER(). Bien que vous deviez ajouter 1 au résultat, ou chance Andomar

+1

Oui, si vous souhaitez que la position soit basée sur une base au lieu de zéro. – Guffa

+0

Une condition: Cette méthode ne fonctionne que sur des clés uniques (qu'un PK serait) –

0

Malheureusement, vous ne pouvez pas obtenir « la position d'un rangée dans une table ". Le meilleur que vous pouvez obtenir, en utilisant ORDER BY et une variante de la construction ROW_NUMBER (dépend du moteur de base de données en cours d'utilisation), est la position d'une ligne dans le jeu de résultats de la requête exécutée. Cependant, cette position ne retourne à aucune position dans la table, sauf si ORDER BY est sur un ensemble de colonnes d'index cluster, mais même alors cette position peut être invalidée la seconde suivante.

Ce que je voudrais savoir, c'est ce que vous vouliez utiliser pour cette "position".

Questions connexes