web-dev-qa-db-fra.com

Comment sélectionner une seule ligne à partir d'Oracle SQL?

Je souhaite utiliser la syntaxe Oracle pour sélectionner une seule ligne de la table DUAL. Par exemple, je veux exécuter cette requête:

SELECT user 
  FROM DUAL

... et il aurait, comme, 40 disques. Mais je n'ai besoin que d'un seul enregistrement. ... ET, je veux y arriver sans une clause WHERE.

J'ai besoin de quelque chose dans le champ nom_table tel que:

SELECT FirstRow(user) 
  FROM DUAL
95
Ben

Vous utilisez ROWNUM.

c'est à dire.

SELECT user FROM Dual WHERE ROWNUM = 1

http://docs.Oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns009.htm

155
mindvirus

J'ai trouvé cette "solution" cachée dans l'un des commentaires. Depuis que je le cherchais depuis un moment, je voudrais le souligner un peu (je ne peux pas encore commenter ou faire ce genre de choses ...), c'est donc ce que j'ai utilisé:

SELECT * FROM (SELECT [Column] FROM [Table] ORDER BY [Date] DESC) WHERE ROWNUM = 1

Ceci m'imprimera l'entrée [Colonne] désirée à partir de l'entrée la plus récente du tableau, en supposant que [Date] est toujours inséré via SYSDATE.

36
user3890681

Cette syntaxe est disponible dans Oracle 12c:

select * from some_table fetch first 1 row only;
select * from some_table fetch first 1 rows only;
select * from some_table fetch first 10 row only;
select * from some_table fetch first 10 rows only;

^^ Je voulais simplement démontrer que la ligne ou les lignes (au pluriel) peuvent être utilisées quel que soit le nombre de lignes souhaité.)

26
mancini0

Autant que je sache, la table dual dans Oracle est une table spéciale comportant une seule ligne. Donc, cela suffirait:

SELECT user
FROM dual
7
ypercubeᵀᴹ

???? La réponse est:

Vous devez utiliser une requête imbriquée comme:

SELECT *
FROM ANY_TABLE_X 
WHERE ANY_COLUMN_X = (SELECT MAX(ANY_COLUMN_X) FROM ANY_TABLE_X) 

=> En PL/SQL, "ROWNUM = 1" n'est PAS égal à "TOP 1" de TSQL.

Donc, vous ne pouvez pas utiliser une requête comme celle-ci: "select * from any_table_x où rownum = 1 order by any_column_x;" Comme Oracle obtient la première ligne, applique ensuite la clause order by.

6
Fuat

nous avons 3 choix pour obtenir la première ligne de la table de base de données Oracle.

1) select * from table_name where rownum= 1 est le meilleur moyen

2) select * from table_name where id = ( select min(id) from table_name)

3)

select * from 
    (select * from table_name order by id)
where rownum = 1
5
Deva

Il n'y a pas de condition limit 1 (c'est-à-dire MySQL/PostgresQL) dans Oracle, vous devez spécifier where rownum = 1.

5
Oh Chin Boon

"FirstRow" est une restriction et donc sa place dans la clause where pas dans la clause select. Et ça s'appelle rownum

select * from dual where rownum = 1;
5
gdoron

Si n'importe quelle ligne ferait l'affaire, essayez:

select max(user)  
from table;

Aucune clause Where.

2
Raihan
select name, price
  from (
    select name, price, 
    row_number() over (order by price) r
      from items
  )
where r between 1 and 5; 
1
Andrew

select a.user from (select user from users order by user) a where rownum = 1

sera le meilleur, une autre option est:

select a.user 
from ( 
select user, 
row_number() over (order by user) user_rank, 
row_number() over (partition by dept order by user) user_dept_rank 
from users 
) a 
where a.user_rank = 1 or user_dept_rank = 2

dans les scénarios dans lesquels vous voulez différents sous-ensembles, mais je suppose que vous pouvez également utiliser RANK(), mais j'aime aussi row_number()over(...) car aucun regroupement n'est requis.

1
Tyler