Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/12/2010, 14h58   #1
Membre habitué
 
Inscription : mai 2007
Messages : 691
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : mai 2007
Messages : 691
Points : 146
Points : 146
Par défaut optimisation d'une requete

Bonjour

j'ai écrit ce petit bout de code pour afficher les 500 derniers enregistrements d'une table qui en compte 80000.

j'utilise une requete pour calculer le nombre max de ligne et je me sers de ce nombre dans la 2ème requete pour utiliser le fonction rows .

ce fonctionne bien mais je voudrais savoir si il est possible d'optimiser ce code en une seule requete ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
procedure TForm2.Button1Click(Sender: TObject);
var
com:integer;
begin
 
ibquery1.close;
ibquery1.SQL.Clear;
ibquery1.SQL.ADD('select count(*) as nb from cmdsup');
ibquery1.Open;
 
com:=ibquery1.FieldByName('nb').AsInteger;
 
ibquery1.close;
ibquery1.SQL.Clear;
ibquery1.SQL.ADD('select * from cmdsup');
ibquery1.SQL.ADD('order by id_cmdsup asc ');
ibquery1.SQL.ADD('rows :com - 500 to :com');
ibquery1.ParamByName('com').AsInteger:=com;
ibquery1.Open;
end;
au début pour faire simple j'avais fait comme ceci:

Code :
1
2
3
4
5
6
7
 
ibquery1.close;
ibquery1.SQL.Clear;
ibquery1.SQL.ADD('select * from cmdsup');
ibquery1.SQL.ADD('order by id_cmdsup desc ');
ibquery1.SQL.ADD('rows 500');
ibquery1.Open;
mais les utilisateurs n'aiment pas l'ordre de classement.
Ils préfèrent avoir un classement du "haut vers le bas" dans une grille


cordialement
looping est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 16h11   #2
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 213
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 213
Points : 3 315
Points : 3 315
D'abord comme dit Ann W. Harrison :
Citation:
The *worst* feature in SQL is "select *". It's a holdover
from an interactive pedagogical language circa 1974 that
has no place in a programming language. It defeats the
use of one of the major features of relational databases -
the separation of logical and physical storage. If you
realize after you've built your application that you really
need a Skype handle as well as a phone number, just add it.
As long as you've used field names in your queries, everything
old works just the way it did and new queries and updated
queries can use the Skype handle. But put one Select *
into the mix and you've got chaos.

The second worst is an insert without a target field list.
sinon en considérant que ID est la clé primaire de ta table
Code :
1
2
3
4
5
SELECT TB1.id_cmdsup  FROM cmdsup AS TB1
JOIN (SELECT ID FROM cmdsup 
          ORDER BY id_cmdsup DESC
          rows 500) AS TB2 ON TB2.ID=TB1.ID
ORDER BY id_cmdsup
sinon tu reclasses dans ta grille
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 16h20   #3
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Préférez toujours donner la liste des colonnes que vous sélectionnez...
Sinon pour votre problème, je dirais quelque chose du genre :
Code :
1
2
SELECT skip ((SELECT count(*) - 500 FROM cmdsup)) * FROM cmdsup
ORDER BY id_cmdsup ASC;
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h16.


 
 
 
 
Partenaires

Hébergement Web