SQL pour retourner le rownum d'une ligne spécifique? (En utilisant db Oracle)
Question
Dans Oracle 10g, j'ai ce SQL:
select dog.id as dogId from CANINES dog order by dog.codename asc
qui retourne:
id
--
204
203
206
923
Je veux étendre cette requête pour déterminer l'oracle rownum d'un dog.id dans ce ResultSet.
J'ai essayé
select rownum from
(select dog.id as dogId from CANINES dog order by dog.codename asc)
where dog.id=206
Mais cela ne fonctionne pas très bien (il renvoie 1, quel que soit dog.id je match sur). Je comptais revenir 3.
Merci pour votre aide!
Remarques
http://www.oracle.com/technology /oramag/oracle/06-sep/o56asktom.html
Je suis assez sûr que je ne ai pas besoin d'utiliser rowid
La solution
Je soupçonne ce que vous voulez est d'utiliser une fonction analytique (RANK, DENSE_RANK
ou ROW_NUMBER
), i.e..
SELECT rnk
FROM (select dog.id as dogId,
ROW_NUMBER() OVER( ORDER BY dog.codename ASC ) rnk
from CANINES dog )
WHERE dogId = 206
Si la colonne ID dans la table CANINE étaient pas unique, GRADE, DENSE_RANK
et ROW_NUMBER
) traiterait des liens différemment.
Si vous voulez le faire uniquement avec ROWNUM,
SELECT rn
FROM (
SELECT dogId, rownum rn
FROM (select dog.id as dogId
from CANINES dog
order by dog.codename ASC) inner
) middle
WHERE dogId = 206
Autres conseils
Si vous êtes après l'identifiant unique de chaque ligne de la table dont vous avez besoin ROWID, pas ROWNUM.
ROWNUM est un qui peut changer pseudo-colonne chaque fois qu'un bit de SQL est exécuté (il est élaboré au moment de la requête)
Voyez si cela fonctionne pour vous:
Réponse
SELECT dog1.DogID, dog1.DogName, COUNT(*) AS rownumber
FROM #ids dog1, #ids dog2
WHERE dog2.DogName <= dog1.DogName
GROUP BY dog1.DogID, dog1.DogName
ORDER BY dog1.DogName
Résultats
DogID DogName rownumber
----------- ---------- -----------
204 Dog 1 1
203 Dog 2 2
206 Dog 3 3
923 Dog 4 4
LDD
CREATE TABLE #ids (DogID int NOT NULL PRIMARY KEY, DogName varchar(10) NOT NULL)
INSERT INTO #ids (DogID, DogName) VALUES (204, 'Dog 1')
INSERT INTO #ids (DogID, DogName) VALUES (203, 'Dog 2')
INSERT INTO #ids (DogID, DogName) VALUES (206, 'Dog 3')
INSERT INTO #ids (DogID, DogName) VALUES (923, 'Dog 4')
Pour ce faire, il serait préférable de modifier la table et ajouter une séquence. Cela pourrait devenir collante si vous avez l'intention de supprimer des lignes. Où, peut-être une meilleure pratique serait d'utiliser une colonne d'état ou début et la fin de jour motif pour décider quelles lignes sont actifs et doivent être retournés.