|
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 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.  |
| |
| |
| | | |
|
| | | | |
| | |
|