Je veux utiliser la syntaxe oracle pour sélectionner seulement 1 ligne de la table DUAL
. Par exemple, je souhaite 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 WHERE
clause.
J'ai besoin de quelque chose dans le champ table_name tel que:
SELECT FirstRow(user)
FROM DUAL
dual
?dual
est la table système dans oracleDUAL
. C'est un peu comme#define TRUE 0
en C - bien sûr, cela pourrait fonctionner pour vous, mais les futurs développeurs vous détesteront.select user from dual
? Sinon, essayez-le et voyez ce que vous obtenez. Sur un système oracle standard, vous récupérerez l'utilisateur avec lequel vous exécutez la commande.Réponses:
Vous utilisez ROWNUM.
c'est à dire.
http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns009.htm
la source
order by
.ORDER BY
est appliqué après leWHERE
.SELECT * FROM (SELECT user FROM Employees ORDER BY SALARY DESC) WHERE ROWNUM <= 10
J'ai trouvé cette "solution" cachée dans l'un des commentaires. Comme je le recherchais depuis un moment, j'aimerais le souligner un peu (je ne peux pas encore commenter ou faire de telles choses ...), voici donc ce que j'ai utilisé:
Cela m'imprimera l'entrée [Colonne] souhaitée à partir de l'entrée la plus récente de la table, en supposant que [Date] est toujours insérée via SYSDATE.
la source
ROWID
, tant que vous ne supprimez aucun enregistrement et que vous vous souciez toujours du dernier inséré / modifié.ROWID
est en quelque sorte modifié au hasard par Oracle. Ça ne l'est pas. Il est basé sur la modification effective des lignes, c'est-à-dire que vous en supprimez une, puis en insérez une. Celui inséré obtiendra l'ancienROWID
. Il y a des choses telles que les tables statiques qui ne sont jamais mises à jour comme des états aux États-Unis est un bon exemple, où si cela changeait, cela aurait probablement d'autres répercussions, de toute façon, quand c'est bien.ROWID
pourrait être changé, un bon DBA les rechercherait et ferait ce qu'il pourrait pour les éviter s'il y avait la possibilité qu'ils affectent une table statique comme je l'ai décrit. seule l'application doit fonctionner. Une exportation de table peut être effectuée avec uneSELECT
instruction à la place. L'importation se produirait une fois et plus jamais. Je comprends votre point de vue, il faut absolument faire attention, mais les problèmes sont loin d’être inévitables.Cette syntaxe est disponible dans Oracle 12c:
^^ Je voulais juste démontrer que la ligne ou les lignes (pluriel) peuvent être utilisées quelle que soit la pluralité du nombre de lignes souhaité.)
la source
nous avons 3 choix pour obtenir la première ligne de la table Oracle DB.
1)
select * from table_name where rownum= 1
est le meilleur moyen2)
select * from table_name where id = ( select min(id) from table_name)
3)
la source
Autant que je sache, la
dual
table dans Oracle est une table spéciale avec une seule ligne. Donc, cela suffirait:la source
👌 La réponse est:
Vous devez utiliser une requête imbriquée comme:
=> En PL / SQL "ROWNUM = 1" n'est PAS égal à "TOP 1" de TSQL.
Vous ne pouvez donc pas utiliser une requête comme celle-ci: "select * from any_table_x where rownum = 1 order by any_column_x;" Parce qu'oracle obtient la première ligne, puis applique ordre par clause.
la source
rownum = 1
, mais nous ne devrions plus laisser les anciens bogues affecter notre code.Il n'y a pas de
limit 1
condition (c'est MySQL / PostgresSQL) dans Oracle, vous devez spécifierwhere rownum = 1
.la source
"FirstRow" est une restriction et par conséquent, il est placé dans la
where
clause et non dans laselect
clause. Et ça s'appelle rownumla source
ORDER BY
, car la commande n'a lieu qu'après la clause where. En d'autres termes, pour obtenir le début d'une certaine requête triée, rownum est totalement inutile.Where
avec une requête Afficher.SELECT * FROM (SELECT * FROM ... WHERE ... ORDER BY ...) WHERE ROWNUM = 1
? Eh bien, cela peut fonctionner, mais cela semble assez stupide, tbh.Si une ligne suffit, essayez:
Aucune clause where.
la source
la source
select a.user from (select user from users order by user) a where rownum = 1
fonctionnera le mieux, une autre option est:
dans les scénarios où vous voulez différents sous-ensembles, mais je suppose que vous pouvez également utiliser
RANK()
Mais, j'aime aussirow_number()
over(...)
car aucun regroupement n'est requis.la source
Si vous souhaitez récupérer uniquement la première ligne d'un résultat trié avec le moins de sous-requêtes, essayez ceci:
la source
Plus flexible que ne l'
select max()
est:la source