2010-04-06 8 views
2

On m'a demandé dans une interview d'écrire une requête SQL qui récupère les trois premiers enregistrements ayant la valeur la plus élevée sur une colonne d'une table. J'avais écrit une requête qui récupérait tous les enregistrements avec la valeur la plus élevée, mais je n'ai pas compris comment exactement je peux obtenir seulement les trois premiers enregistrements de ceux-ci.Question simple sur la requête de base de données

Pourriez-vous m'aider?

Merci.

Répondre

5

SELECT TOP 3 * FROM Table ORDER BY FieldName DESC

De here, mais peut-être un peu de ce jour:

Postgresql:

SELECT * FROM Table ORDER BY FieldName DESC LIMIT 3 

MS SQL Server:

SELECT TOP 3 * FROM Table ORDER BY FieldName DESC 

mySQL:

SELECT * FROM Table ORDER BY FieldName DESC LIMIT 3 
+1

Ce n'est pas correct pour Oracle. Il applique le WHERE avant le ORDER BY, donc vous obtenez 10 lignes qui correspondent, puis les trie. –

+0

@WW - Si vous souhaitez supprimer l'Oracle, par exemple, puis. Ma compréhension de celui-ci n'est pas assez complexe pour y répondre pleinement. C'était initialement à partir du lien posté dans la réponse. –

+0

Dans Oracle 'SELECT R. * FROM (SELECT * FROM SomeTable ORDER par FieldName DESC) R WHERE rownum <4' fera l'affaire pour vous. Bien sûr, il existe une autre méthode impliquant les fonctions Oracle Analytical de 'LEAD, LAG', qui ne peuvent pas être couvertes ici. – Guru

1

Selon le moteur de base de données, que ce soit

select top 3 * from table order by column desc

ou

select * from table order by column desc limit 3

+0

ou autre chose sur Oracle ... – Thilo

0

La syntaxe de TOP 3 varie considérablement d'un base de données à base de données. Malheureusement, vous devez utiliser ces constructions pour obtenir les meilleures performances. Les bibliothèques comme Hibernate aident ici, car elles peuvent traduire une API commune dans les différents dialectes SQL. Puisque vous posez des questions sur Java, il est possible de simplement tout sélectionner dans la base de données (avec un ORDER BY), mais de ne récupérer que les trois premières lignes. Selon la façon dont la requête doit être exécutée, cela peut être suffisant (en particulier si aucun tri de la base de données ne doit se faire grâce aux index appropriés, par exemple lorsque vous triez par champs de clé primaire).

Mais en général, vous voulez aller avec une solution SQL.

0

Oracle vous pouvez également utiliser où rownum < 4 ...

également sur MySQL il y a un mot-clé limite (je pense)