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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top