PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV (versões anteriores) → Importance de l'ordre dans une condition de requête SQL
Importance de l'ordre dans une condition de requête SQL
Iniciado por Mathieu, jul., 07 2025 4:57 PM - 2 respostas
Membro registado
2 mensagems
Publicado em julho, 07 2025 - 4:57 PM
Bonjour,

Je suis actuellement en version 26 de Windev.

J'ai un problème lors de l'exécution d'une requête SQL, que ce soit en exécutable, en test, en WDMap ou en centre de contrôle HFSQL, voici ma requête :
SELECT DISTINCT A.Code FROM A INNER JOIN B ON A.Code=B.Code WHERE A.Type<>'1' ET A.Type<>'2' ET A.Type<>'5' ET A.Type<>'7' ET (A.DTM>'2025070715425151' OU (B.Date='20250707' ET B.Heure>='15445151'))
Cette requête me renvoi la réponse : 000123

Cependant si j'inverse l'ordre dans ma condition :
SELECT DISTINCT A.Code FROM A INNER JOIN B ON A.Code=B.Code WHERE A.Type<>'1' ET A.Type<>'2' ET A.Type<>'5' ET A.Type<>'7' ET ((B.Date='20250707' ET B.Heure>='15445151') OU A.DTM>'2025070715425151')
Cette requête me renvoi la réponse : 000123 - 000124

La réponse de la deuxième requête est la bonne, mais je ne comprend pas pourquoi l'ordre de la condition impacterai le résultat. J'ai fais un test avec la version 28 puis 2024 d'un collègue et les deux requêtes renvoient le bon résultat à chaque fois, peu importe l'ordre.

Je doute maintenant du résultat des requêtes SQL que j'aurai pu faire auparavant, si quelqu'un peut m'éclairer.
Merci.
Membro registado
1 mensagem
Publicado em julho, 22 2025 - 2:00 PM
Problème : l’ordre d’évaluation des conditions n’est pas respecté comme vous l’attendez, même si vous avez bien mis des parenthèses autour du (B.Date = ... AND B.Heure >= ...).
https://www.marykayintouches.com
Dans Windev 26 (et potentiellement dans certaines implémentations du moteur HFSQL), il semble que le moteur interprète à tort les conditions ET ... OU ... sans respecter strictement la priorité des parenthèses, surtout si le parseur SQL est un peu "naïf".

SELECT DISTINCT A.Code
FROM A
INNER JOIN B ON A.Code = B.Code
WHERE A.Type <> '1' AND A.Type <> '2' AND A.Type <> '5' AND A.Type <> '7'
AND ((B.Date = '20250707' AND B.Heure >= '15445151') OR A.DTM > '2025070715425151')
Ici, vous inversez l'ordre des conditions dans le OU, et cette fois le moteur retourne le bon jeu de résultats, car les parenthèses englobent clairement l’ensemble de la condition logique.

Explication technique
En SQL standard, les opérateurs AND ont une priorité plus forte que les OR. Cela signifie :

sql
Copy
Edit
A AND B OR C
...est interprété comme :

sql
Copy
Edit
(A AND B) OR C
Dans votre requête 1 :

sql
Copy
Edit
... AND A.DTM > '...' OR (B.Date = ... AND B.Heure >= ...)
→ Cela pourrait être interprété à tort comme :

sql
Copy
Edit
(... AND A.DTM > '...') OR (B.Date = ... AND B.Heure >= ...)
Même si vous aviez l’intention d’écrire :

sql
Copy
Edit
... AND (A.DTM > '...' OR (B.Date = ... AND B.Heure >= ...))
Mais dans Windev 26, l’ordre des conditions semble casser l’analyse logique malgré les parenthèses.
Membro registado
2 mensagems
Publicado em julho, 23 2025 - 9:31 AM
Merci pour votre explication. :)