web-dev-qa-db-fra.com

Comment puis-je faire top 1 dans Oracle?

Comment puis-je faire ce qui suit?

select top 1 Fname from MyTbl

Dans Oracle 11g ?

219
Gold

Si vous voulez juste une première ligne sélectionnée, vous pouvez:

select fname from MyTbl where rownum = 1

Vous pouvez également utiliser des fonctions analytiques pour ordonner et prendre le top x:

select max(fname) over (rank() order by some_factor) from MyTbl
237
mcpeterson
SELECT *
  FROM (SELECT * FROM MyTbl ORDER BY Fname )
 WHERE ROWNUM = 1;
152

Avec Oracle 12c (juin 2013), vous pouvez l'utiliser comme suit.

SELECT * FROM   MYTABLE
--ORDER BY COLUMNNAME -OPTIONAL          
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
25
MSK

Vous pouvez utiliser ROW_NUMBER() avec une clause ORDER BY dans la sous-requête et utiliser cette colonne à la place de TOP N. Ceci peut être expliqué pas à pas.

Voir le tableau ci-dessous qui a deux colonnes NAME et DT_CREATED.

enter image description here

Si vous ne devez prendre que les deux premières dates indépendamment de NAME, vous pouvez utiliser la requête ci-dessous. La logique a été écrite dans la requête

-- The number of records can be specified in WHERE clause
SELECT RNO,NAME,DT_CREATED
FROM
(
    -- Generates numbers in a column in sequence in the order of date
    SELECT ROW_NUMBER() OVER (ORDER BY DT_CREATED) AS RNO,
    NAME,DT_CREATED
    FROM DEMOTOP
)TAB
WHERE RNO<3;

RÉSULTAT

enter image description here

Dans certaines situations, nous devons sélectionner TOP N résultats pour chaque NAME. Dans ce cas, nous pouvons utiliser PARTITION BY avec une clause ORDER BY dans la sous-requête. Reportez-vous à la requête ci-dessous.

-- The number of records can be specified in WHERE clause
SELECT RNO,NAME,DT_CREATED
FROM
(
  --Generates numbers in a column in sequence in the order of date for each NAME
    SELECT ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY DT_CREATED) AS RNO,
    NAME,DT_CREATED
    FROM DEMOTOP
)TAB
WHERE RNO<3;

RÉSULTAT

enter image description here

9
Sarath Avanavu

Vous pouvez faire quelque chose comme

    SELECT *
      FROM (SELECT Fname FROM MyTbl ORDER BY Fname )
 WHERE rownum = 1;

Vous pouvez également utiliser les fonctions analytiques RANK et/ou DENSE_RANK, mais ROWNUM est probablement la plus simple.

7
Suman
select * from (
    select FName from MyTbl
)
where rownum <= 1;
6
a'r

Utilisation:

SELECT x.*
  FROM (SELECT fname 
          FROM MyTbl) x
 WHERE ROWNUM = 1

Si vous utilisez Oracle9i +, vous pourriez regarder tiliser des fonctions analytiques telles que ROW_NUMBER () mais elles ne fonctionneront pas aussi bien que ROWNUM .

5
OMG Ponies

Pour sélectionner la première ligne d'un tableau et pour sélectionner une ligne d'un tableau, deux tâches différentes nécessitent une requête différente. Il y a plusieurs façons possibles de le faire. Quatre d'entre eux sont:

Première

select  max(Fname) from MyTbl;

Seconde

select  min(Fname) from MyTbl;

Troisième

select  Fname from MyTbl  where rownum = 1;

Quatrième

select  max(Fname) from MyTbl where rowid=(select  max(rowid) from MyTbl)
3
Vikas Hardia

J'ai eu le même problème, et je peux résoudre ce problème avec cette solution:

select a.*, rownum 
from (select Fname from MyTbl order by Fname DESC) a
where
rownum = 1

Vous pouvez commander votre résultat avant d'avoir la première valeur en haut.

Bonne chance

2
user2607028