PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → SQL - lecture à l'envers
SQL - lecture à l'envers
Débuté par jgachet, 04 jan. 2005 18:23 - 6 réponses
Posté le 04 janvier 2005 - 18:23
bonjour,

je souhaite effectuer une requete qui me permette de lire un ensemble d'enregistrement vers le haut.

la base de donnée n'est pas HP ni oracle ou une de connu, c'est une base BASIS

j'accede a cette base via de l'odbc et affiche et envoie les requetes par un programme ecrit avec windev

mon probleme est le suivant :

imaginons un fichier contenant 4 millions d'enregistrements, j'affiche à l'ecran l'enregistrement n° 2 500 100. mon but est de retrouver les 16 enregistrements imédiatement au dessus du 2 500 100° enregistrement,

soit le 2 500 003° jusqu'au 2 500 109° .

quelle fonction de sql permette une lecture a l'envers ?

sachant que je possede une solution qui consiste à lire les 16 premiers enregistrement classé dans l'ordre décroissant du n°1 au n° 2 500 109.

SELECT TOP 16 reference
FROM fichier
WHERE reference<= "la reference de l'enregistrement n° 2 500 100"
ORDER BY reference DESC

En terme de temps de reponse, cela est extrement long (plus de 2 min quand ca fait pas un timed out) ce qui me semble tout a fait logique puisque je doi classer dans l'ordre décroissant 2 500 109 enregistrements.

Ma question est : existe t il une fonction SQL plus simple ? est ce que sur des bases de données comme Oracle ou mysql, classer dans l'ordre décroissant un tel nombre d'enregistrement prend autant de temps ?

merci de l'aide que vous pourrez apporter meme si je pense qu'il n'existe pas de solution sachant que j'ai déjà epluché un grand nombre de sites internet, mais l'espoir fait vivre.

bonne année a tous, meilleurs voeux

et merci d'avance.
Posté le 04 janvier 2005 - 18:34
je ferais dans mon WHERE une restriction :
WHERE reference>2 500 003 AND reference<=2 500 109
sachant que ce champ doit être ABSOLUMENT indexé

"jerome" <jgachet@soubabere.fr> a écrit dans le message de
news:41dab8b3@news.pcsoft.fr...


bonjour,

je souhaite effectuer une requete qui me permette de lire un ensemble

d'enregistrement vers le haut.

la base de donnée n'est pas HP ni oracle ou une de connu, c'est une base

BASIS

j'accede a cette base via de l'odbc et affiche et envoie les requetes par

un programme ecrit avec windev

mon probleme est le suivant :

imaginons un fichier contenant 4 millions d'enregistrements, j'affiche à

l'ecran l'enregistrement n° 2 500 100. mon but est de retrouver les 16
enregistrements imédiatement au dessus du 2 500 100° enregistrement,

soit le 2 500 003° jusqu'au 2 500 109° .

quelle fonction de sql permette une lecture a l'envers ?

sachant que je possede une solution qui consiste à lire les 16 premiers

enregistrement classé dans l'ordre décroissant du n°1 au n° 2 500 109.

SELECT TOP 16 reference
FROM fichier
WHERE reference<= "la reference de l'enregistrement n° 2 500 100"
ORDER BY reference DESC

En terme de temps de reponse, cela est extrement long (plus de 2 min quand

ca fait pas un timed out) ce qui me semble tout a fait logique puisque je
doi classer dans l'ordre décroissant 2 500 109 enregistrements.

Ma question est : existe t il une fonction SQL plus simple ? est ce que

sur des bases de données comme Oracle ou mysql, classer dans l'ordre
décroissant un tel nombre d'enregistrement prend autant de temps ?

merci de l'aide que vous pourrez apporter meme si je pense qu'il n'existe

pas de solution sachant que j'ai déjà epluché un grand nombre de sites
internet, mais l'espoir fait vivre.

bonne année a tous, meilleurs voeux

et merci d'avance.
Posté le 04 janvier 2005 - 18:37
J'ai oublié de dire que c à toi de stocker les n° d'enregistrement de 1 à 2
500 100 dans le champ reference

"jerome" <jgachet@soubabere.fr> a écrit dans le message de
news:41dab8b3@news.pcsoft.fr...


bonjour,

je souhaite effectuer une requete qui me permette de lire un ensemble

d'enregistrement vers le haut.

la base de donnée n'est pas HP ni oracle ou une de connu, c'est une base

BASIS

j'accede a cette base via de l'odbc et affiche et envoie les requetes par

un programme ecrit avec windev

mon probleme est le suivant :

imaginons un fichier contenant 4 millions d'enregistrements, j'affiche à

l'ecran l'enregistrement n° 2 500 100. mon but est de retrouver les 16
enregistrements imédiatement au dessus du 2 500 100° enregistrement,

soit le 2 500 003° jusqu'au 2 500 109° .

quelle fonction de sql permette une lecture a l'envers ?

sachant que je possede une solution qui consiste à lire les 16 premiers

enregistrement classé dans l'ordre décroissant du n°1 au n° 2 500 109.

SELECT TOP 16 reference
FROM fichier
WHERE reference<= "la reference de l'enregistrement n° 2 500 100"
ORDER BY reference DESC

En terme de temps de reponse, cela est extrement long (plus de 2 min quand

ca fait pas un timed out) ce qui me semble tout a fait logique puisque je
doi classer dans l'ordre décroissant 2 500 109 enregistrements.

Ma question est : existe t il une fonction SQL plus simple ? est ce que

sur des bases de données comme Oracle ou mysql, classer dans l'ordre
décroissant un tel nombre d'enregistrement prend autant de temps ?

merci de l'aide que vous pourrez apporter meme si je pense qu'il n'existe

pas de solution sachant que j'ai déjà epluché un grand nombre de sites
internet, mais l'espoir fait vivre.

bonne année a tous, meilleurs voeux

et merci d'avance.
Posté le 04 janvier 2005 - 18:57
peux etre une alternative mais c'est à tester :

Tu peux les sortir sans le "ORDER BY" et les classer ensuite dans un tableau


Tiens ns au courant
Posté le 05 janvier 2005 - 13:13
le probleme que j'ai, c'est que la reference n'est pas le numéro d'enregistrement dans le fichier

mon fichier est un fichier article, et cette rubrique n'est pas la clé primaire et est bien indéxé, elle correspond à la reference fournisseur, sachant que la clé primaire est composé :
- code societe
- code depot
- reference interne ( composé de l'abreviation du nom du fournisseur + reference fournisseur).

dans ce fichier il peut exister parfois jusqu'à 5 fois la meme reference fournisseur qui correspond pour que vous comprenniez mieux à la réference de different fournisseurs de l'article sachant qu'une reference peut correspondre par exemple à une boite de visse chez un fournisseur et a un paquet de smarties pour un autre.

je n'ai aucun moyen de connaitre le numéro d'enregistrement de la ligne de départ, donc de connaitre le fameux numéro 2 500 100.

lorsque j'autorise une recherche, un utilisateur peut composé un morceau de reference ou une reference entiere sil la connait. je parle bien de la reference fournisseur puisque la reference interne est invisible a ces utilisateurs.

ma requete est tres simple

SELECT TOP 16 * FROM fichier_article
WHERE reference_fournisseur >= "reference saisie par l'utilisateur"
ORDER BY reference_fournisseur

par defaut le tri est fai sur la clé primaire ce qui ne m'interesse pas puisque je travaille avec la reference_fournisseur d'ou l'utilisation du ORDER BY.

Pour des raisons de temps de réponse, je ne fait afficher dans une table windev que les 16 premiers enregistrement qui corresponde au plus pret a la reference saisie et les suivants. il est evident que si un utilisateur saisie une reference qui se situe dans les premiers enregistrements, je ne peux pas faire afficher les quatres millions qui suivent.

si il veu consulter ceux qui suivent, il possede un bouton de defilement. ici aucun probleme je refai la meme requete.

le probleme est lorqu'il souhaite visualiser les enregistrements précédants. je ne peux pas le faire remonter aussi facilement que avec les hlitprecedents etc ...
Posté le 06 janvier 2005 - 10:34
déja j'utiliserai la notion de LIKE 'code%' dans la clause WHERE de façon à
ne sélectionner que les 'commencants par' (il y en aura bcp moins que des
'supérieur à')
utilises-tu le fetch partiel?

"jerome" <jgachet@soubabere.fr> a écrit dans le message de
news:41dbc198@news.pcsoft.fr...

le probleme que j'ai, c'est que la reference n'est pas le numéro

d'enregistrement dans le fichier

mon fichier est un fichier article, et cette rubrique n'est pas la clé

primaire et est bien indéxé, elle correspond à la reference fournisseur,
sachant que la clé primaire est composé :
- code societe
- code depot
- reference interne ( composé de l'abreviation du nom du fournisseur +

reference fournisseur).

dans ce fichier il peut exister parfois jusqu'à 5 fois la meme reference

fournisseur qui correspond pour que vous comprenniez mieux à la réference de
different fournisseurs de l'article sachant qu'une reference peut
correspondre par exemple à une boite de visse chez un fournisseur et a un
paquet de smarties pour un autre.

je n'ai aucun moyen de connaitre le numéro d'enregistrement de la ligne de

départ, donc de connaitre le fameux numéro 2 500 100.

lorsque j'autorise une recherche, un utilisateur peut composé un morceau

de reference ou une reference entiere sil la connait. je parle bien de la
reference fournisseur puisque la reference interne est invisible a ces
utilisateurs.

ma requete est tres simple

SELECT TOP 16 * FROM fichier_article
WHERE reference_fournisseur >= "reference saisie par l'utilisateur"
ORDER BY reference_fournisseur

par defaut le tri est fai sur la clé primaire ce qui ne m'interesse pas

puisque je travaille avec la reference_fournisseur d'ou l'utilisation du
ORDER BY.

Pour des raisons de temps de réponse, je ne fait afficher dans une table

windev que les 16 premiers enregistrement qui corresponde au plus pret a la
reference saisie et les suivants. il est evident que si un utilisateur
saisie une reference qui se situe dans les premiers enregistrements, je ne
peux pas faire afficher les quatres millions qui suivent.

si il veu consulter ceux qui suivent, il possede un bouton de defilement.

ici aucun probleme je refai la meme requete.

le probleme est lorqu'il souhaite visualiser les enregistrements

précédants. je ne peux pas le faire remonter aussi facilement que avec les
hlitprecedents etc ...

Posté le 06 janvier 2005 - 11:28
je ne peux pas utiliser le Like '%' car les references ne commencent pas toutes pareil

ex : '1234'

et la reference au dessus : '056', ce qui ne pourra donc pas marcher.

quand au fetch partiel, je ne l'utilise pas. mais je vais me renseigner et voir ce que je peux faire