Bonsoir,
Comme disait Roland Magdane qui en l’occurrence avait une tendance à une sympathique dyslexie : « je récapépète depuis le bédut ».
A propos de la requête de Waldar :
Code:
1 2 3 4 5 6 7 8 9
| SELECT min(rfr.SiteRisque) AS MinDeSiteRisque
, rfr.SiteComptable
FROM ( SELECT SiteComptable, Max(Taux) AS MaxDeTaux
FROM Referentiel
GROUP BY SiteComptable ) as tmx
JOIN Referentiel as rfr
ON tmx.SiteComptable = rfr.SiteComptable
AND tmx.MaxDeTaux = rfr.Taux
GROUP BY rfr.SiteComptable; |
Cette requête est conforme à la norme SQL qui autorise à ne pas coder le mot INNER, auquel cas il est implicite ; je cite à ce propos le document de référence SQL/Foundation : WG3:HBA-003 = H2-2003-305 = 5WD-02-Foundation-2003-09, WD 9075-2 (SQL/Foundation), September, 2003, page 313 :
If a <qualified join> or <natural join> is specified and a <join type> is not specified, then INNER is implicit.
Toutefois, quand on veut exécuter cette requête dans le contexte ACCESS 2003 :
1) Il faut remplacer JOIN par INNER JOIN car ACCESS 2003 n’a pas manifestement pas tenu compte de la norme. Pour les versions suivantes d’ACCESS je ne me prononce pas puisque je n’en dispose pas, mais si quelqu’un peut fournir le lien vers une référence officielle à ce propos, on lui en sera reconnaissant.
2) Remplaçons donc JOIN par INNER JOIN. ACCESS 2003 transforme alors d’autorité la requête sans demander l’avis du développeur, en remplaçant une paire de parenthèses par une paire de crochets et en ajoutant un point-virgule :
http://www.fsmwarden.com/developpez_...vant_point.png
Mais à l’exécution de la requête, on a droit au message :
http://www.fsmwarden.com/developpez_...or_message.png
Fort perplexe, j’ai cherché et fini par dénicher un spécialiste particulièrement perspicace, lequel a préconisé d’ajouter un point derrière le crochet fermant :
http://www.fsmwarden.com/developpez_...pres_point.png
Ça ressemble étonnamment à un objet d’une classe...
Peu importe, la présence de ce point fait que la requête fonctionne ! Manifestement il y a un bug qui n’avait pas été détecté par Microsoft dans la version d’ACCESS dont je dispose (ou dont l'éventuelle correction ne m'a pas été signalée, bien que je sois un utilisateur enregistré)...
Citation:
Envoyé par
fsmrel
Je viens de m’en assurer avec ACCESS 2003 qui refuse le SELECT de Waldar, et il faudrait s’assurer de ce qu’il en est avec les versions suivantes d’ACCESS (si j’interprète correctement que je lis
ici, ça n’a pas bougé).
Dans le cas d’ACCESS 2003 l’énigme a donc une explication il faut en passer par le bricolage évoqué ci-dessus, non documenté par l’éditeur. J’ai cru comprendre que dans les versions suivantes, ce bricolage à coups de crochets, de points-virgules et de points n’a plus lieu d’être. Est-ce à partir d’ACCESS 2007, 2010 ?
Il n’en demeure pas moins que la documentation d’ACCESS n’a manifestement pas été mise à jour depuis un bon moment et ne tient pas compte de la norme qui décrit les « tables dérivées », c'est-à-dire les subqueries sous le contrôle de FROM (cf. pages 301 et 303 du document SQL/Foundation cité plus haut).
Voici ce qui écrit en 2013 dans la documentation ACCESS :
http://www.fsmwarden.com/developpez_...3_From_Doc.png
tableexpression ne représente donc qu’une liste de noms de tables, sans faire mention du type hypothétique des tables elles-mêmes (table de base, vue, requête, table dérivée, instantané...), ce qui est une source d’ambiguïtés et de quiproquos.
A contrario, les autres SGBD comme Oracle, DB2, PostgreSQL ou MS SQL Server sont exhaustifs dans leur présentation de la clause FROM. Par exemple, avec MS SQL Server :
http://www.fsmwarden.com/developpez_...r_From_Doc.png
Et MS SQL Server fournit les exemples qui vont bien :
http://www.fsmwarden.com/developpez_...oc_Derived.png
J’en conclus qu’il ne faut accorder aucune confiance à la doc officielle d’ACCESS, en tout cas celle qui s’adresse au développeur, trop indigente en la matière.
Citation:
Envoyé par
fsmrel
Peut-être quelque chose comme ça conviendrait aussi :
Code:
1 2 3 4 5 6 7
| SELECT MIN(SiteRisque) AS MinDeSiteRisque, SiteComptable
FROM REFERENTIEL AS x
WHERE (SELECT Count (*)
FROM REFERENTIEL AS y
WHERE x.SiteComptable = y.SiteComptable
AND x.Taux < y.Taux) < 1
GROUP BY SiteComptable; |
Quelqu’un a attribué un vote négatif à cette requête : il eut mieux fait de la tester, car elle fonctionne parfaitement (voxov confirme), et surtout elle vient en droite ligne de l’ouvrage du maître incontesté de la théorie relationnelle, C.J. Date : Relational Database, Writings 1994-1997, « Installment Number 47, Quota Queries », à la page 163.
Citation:
Envoyé par
islamov2000
Voici la requete, ca va t'aider:?
Code:
1 2 3 4 5 6 7 8
|
SELECT Min(A.SiteRisque) AS MinDeSiteRisque, B.SiteComptable
FROM Latable AS A INNER JOIN
(SELECT Max(Latable.Taux) AS MaxDeTaux, Latable.SiteComptable
FROM Latable
GROUP BY Latable.SiteComptable) AS B
ON (A.SiteComptable = B.SiteComptable) AND (A.Taux = B.MaxDeTaux)
Group by B.SiteComptable,B.MaxDeTaux |
A condition d'utiliser une version d’ACCESS supérieure à 2003, c'est d'accord, cette requête fonctionne puisque c’est la jumelle de celle de Waldar, avec le mot INNER en plus.
Citation:
Envoyé par
fsmrel
islamov2000,
Hélas ! Votre requête ne peut pas servir à voxov qui a précisé qu’il utilisait ACCESS, lequel n’accepte pas de (SELECT... FROM...) dans un FROM, comme cela fut déjà signalé dans la discussion.
Que les utilisateurs d’une version d’ACCESS plus récente que la mienne me pardonnent cette affirmation qui est, comme je l'ai expliqué, la conséquence d’un bug d’ACCESS 2003 et d’une documentation officielle encore incomplète en 2013...
Citation:
Envoyé par
islamov2000
pour Expert Confirmé Sénior @fsmrel et Modérateur @ Chtulus
Avant de s'anticiper les commentaires il faut "penser et repenser".
Au moins vous mettez vos temps pour essayer les exemples.
Je m'excuse "Expert Confirmé Sénior" et "Modérateur".
Voyez-vous, membre chevronné, vous avez pu être froissé et j’en suis désolé, mais quoi que vous en jugiez, vos interlocuteurs pensent et repensent, testent soigneusement ce qu’ils écrivent (y compris en reprenant les requêtes du maître C.J. Date), avec tous les SGBD qu’ils ont sous la main, et une foule de forumeurs peuvent en témoigner. Mais, concours de circonstances malheureux, nul n’est à l’abri d’un bug de la part de l’éditeur et du laxisme d’une documentation officielle. Avec un peu de recul, j'espère que vous en conviendrez.
Bonne continuation.