SQL per restituire il numero di riga di una riga specifica?(utilizzando il database Oracle)

StackOverflow https://stackoverflow.com/questions/534217

  •  22-08-2019
  •  | 
  •  

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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top