PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WEBDEV (précédentes versions) → [HFSQL] Résultat TOP x + ORDER BY
[HFSQL] Résultat TOP x + ORDER BY
Débuté par Phendel, 31 mai 2021 10:26 - 2 réponses
Membre enregistré
6 messages
Posté le 31 mai 2021 - 10:26
Bonjour,

Je viens de constater un effet très bizarre sur une requête dans l'environnement de mon client.
En effet, il semblerait que HFSQL exécute d'abord la clause TOP (ou LIMIT) puis ORDER BY, ce qui n'est pas le résultat voulu et qui, j'ai bien vérifié, ne correspond pas au standard SQL.

C'est bien l'inverse qui est censé se produire ?

Voici une illustration avec quelques requêtes :
SELECT CRENEAU.DATE, CRENEAU.HEURE
FROM CRENEAU
WHERE CRENEAU.DATE = '20210527'

Résultat (545 enregistrements) :
27/05/2021, 08:20
27/05/2021, 16:50
27/05/2021, 08:20
27/05/2021, 16:55
[...]
27/05/2021, 16:50
27/05/2021, 08:20
27/05/2021, 16:50

Avec clause ORDER BY pour trier le résultat :
SELECT CRENEAU.DATE, CRENEAU.HEURE
FROM CRENEAU
WHERE CRENEAU.DATE = '20210527'
ORDER BY CRENEAU.DATE, CRENEAU.HEURE

27/05/2021, 07:00
27/05/2021, 07:00
27/05/2021, 07:00
27/05/2021, 07:00
27/05/2021, 07:00
27/05/2021, 07:05
27/05/2021, 07:05
27/05/2021, 07:05
[...]
27/05/2021, 17:25
27/05/2021, 17:25
27/05/2021, 17:30
27/05/2021, 17:30
27/05/2021, 17:30
27/05/2021, 17:30
27/05/2021, 17:30

Puis on extrait que les x premiers qui nous intéresse :
SELECT TOP 3 CRENEAU.DATE, CRENEAU.HEURE
FROM CRENEAU
WHERE CRENEAU.DATE = '20210527'
ORDER BY CRENEAU.DATE, CRENEAU.HEURE


Résultat attendu :
27/05/2021, 07:00
27/05/2021, 07:00
27/05/2021, 07:00

Résultat obtenu (idem avec LIMIT) :
27/05/2021, 08:20
27/05/2021, 08:20
27/05/2021, 16:50


J'ai essayé de faire une sous-requête avec la partie ORDER BY mais visiblement HFSQL ne sait pas gérer cette syntaxe.

Avez-vous des solutions ? Selon moi, je pense ne pas avoir le choix que de parcourir manuellement mes x enregistrements, mais c'est dommage et cela peut impacter les performances en cas de nombreux horaires pour un jour donné.

Merci de vos réponse.

Cordialement,

Phendel
Posté le 31 mai 2021 - 13:24
question bête... as tu bien une clé composée faite de CRENEAU.DATE+ CRENEAU.HEURE?

Si oui, le order by devrait être fait par défaut en utilisant cette clé, et donc AVANT le top
Membre enregistré
6 messages
Posté le 31 mai 2021 - 13:57
Merci pour cette réponse, c'est effectivement une piste suggérée en interne et effectivement la clé composée utilisée n'inclue pas la rubrique Heure.
Je ne savais pas que les index impactait l'ordre d'exécution des clauses TOP/LIMIT et ORDER BY.

Nous partirons sur cette solution ultérieurement car une alternative hors SQL a été développée en attendant.