SQL per restituire il numero di riga di una riga specifica?(utilizzando il database Oracle)
Domanda
In Oracle 10g, ho questo SQL:
select dog.id as dogId from CANINES dog order by dog.codename asc
che restituisce:
id
--
204
203
206
923
Voglio estendere questa query per determinare il numero di riga dell'oracolo di un dog.id in questo set di risultati.
Ho provato
select rownum from
(select dog.id as dogId from CANINES dog order by dog.codename asc)
where dog.id=206
Ma questo non funziona molto bene (restituisce 1 indipendentemente da quale dog.id abbino).Mi aspettavo di tornare 3.
Grazie per l'aiuto!
Appunti
http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html
Sono abbastanza sicuro di non aver bisogno di usare Rowid
Soluzione
Ho il sospetto che ciò che si vuole è quella di utilizzare una funzione analitica (RANK, DENSE_RANK
o ROW_NUMBER
), cioè.
SELECT rnk
FROM (select dog.id as dogId,
ROW_NUMBER() OVER( ORDER BY dog.codename ASC ) rnk
from CANINES dog )
WHERE dogId = 206
Se la colonna ID nella tabella CANINI non fosse unico, RANK, DENSE_RANK
, e ROW_NUMBER
) tratterebbe legami in modo diverso.
Se si vuole fare questo solo con 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
Altri suggerimenti
Se siete dopo l'identificatore univoco di ogni riga della tabella è necessario ROWID, non ROWNUM.
ROWNUM è un pseudocolonna che può cambiare ogni volta che viene eseguito un po 'di SQL (è elaborato in fase di query)
Vedi se questo funziona per te:
Risposta
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
Risultati
DogID DogName rownumber
----------- ---------- -----------
204 Dog 1 1
203 Dog 2 2
206 Dog 3 3
923 Dog 4 4
DDL
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')
Al fine di raggiungere questo obiettivo, sarebbe meglio per modificare la tabella e aggiungere una sequenza. Questo potrebbe diventare appiccicosa se avete intenzione di eliminare le righe. Dove, forse una pratica migliore sarebbe quella di utilizzare una colonna di stato o e start-end-date motivo per decidere quali file sono attivi e deve essere restituito.