IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Requête sql challenge


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 116
    Points : 52
    Points
    52
    Par défaut Requête sql challenge
    Bonjour,

    Je suis devant un cas apparemment simple qui défie les possibilités du sql.

    Les données : table "Referentiel"

    SiteRisque 	SiteComptable	Taux
    AAA		 123		        0,33
    ABC		 123		        0,22
    DEF		 123		        0,11
    GHV 		 123		        0,33
    IJB		 678		        0,80
    QSD		 123		        0,33
    UJK 		 678		        0,45
    UNF		 890		        0,99
    YGV	 	 890		        0,25

    L'objectif :
    Sortir la liste des SiteRisque qui ont le taux maximal, par SiteComptable. S'il y a plusieurs SiteRisque qui ont le même taux maximal par SiteComptable, prendre le SiteRisque minimum parmi ces SiteRisque.

    Sur les données ci-dessus, le résultat est le suivant :

    SiteComptable	SiteRisque
    123		AAA
    678		IJB
    890		UNF
    En Access, j'obtiens le résultat avec 2 requêtes. La seconde utilise la première :

    1. Requete "qMaxTaux1"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Referentiel.SiteComptable, Max(Referentiel.Taux) AS MaxDeTaux
    FROM Referentiel
    GROUP BY Referentiel.SiteComptable;
    2.Requete "qMaxTaux2"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Min(Referentiel.SiteRisque) AS MinDeSiteRisque, Referentiel.SiteComptable
    FROM qMaxTaux1 INNER JOIN Referentiel ON (qMaxTaux1.SiteComptable = Referentiel.SiteComptable) AND (qMaxTaux1.MaxDeTaux = Referentiel.Taux)
    GROUP BY Referentiel.SiteComptable;
    Rem. Je n'utilise pas de table intermédiaire entre les deux requêtes.


    La question : Je voudrais obtenir le résultat avec une seule requête sql (qui peut elle-même contenir une sous-requête, mais pas deux requêtes séparées ni une table intermédiaire).


    Merci d'avance pour vos réponses/réactions.

    V.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Est-ce que ça renvoie le bon résultat ?
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select min(t1.SiteRisque),t1.SiteComptable,t1.taux
    from referentiel t1
    left outer join referentiel t2. on t1.sitecomptable = t2.sitecomptable and t1.taux < t2.taux
    where t2.taux is null
    group by t1.SiteComptable,t1.taux

    Tatayo.

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par voxov Voir le message
    Je suis devant un cas apparemment simple qui défie les possibilités du sql.
    Sur Oracle Database ça s'écrit en une seule requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      select SiteComptable
           , min(SiteRisque) keep(dense_rank first order by Taux desc) as SiteRisque
        from Referentiel
    group by SiteComptable
    order by SiteComptable asc;

    Citation Envoyé par voxov Voir le message
    La question : Je voudrais obtenir le résultat avec une seule requête sql (qui peut elle-même contenir une sous-requête, mais pas deux requêtes séparées ni une table intermédiaire).
    Ne pouvez-vous pas tout simplement imbriquer les deux requêtes que vous avez écrites ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 116
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Bonjour,
    Est-ce que ça renvoie le bon résultat ?
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select min(t1.SiteRisque),t1.SiteComptable,t1.taux
    from referentiel t1
    left outer join referentiel t2. on t1.sitecomptable = t2.sitecomptable and t1.taux < t2.taux
    where t2.taux is null
    group by t1.SiteComptable,t1.taux

    Tatayo.
    Oui, Le résultat est celui attendu.
    Merci Tatayo.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 116
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Sur Oracle Database ça s'écrit en une seule requête
    Merci pour la réponse, mais je n'utilise pas Oracle et je préfère une solution non propriétaire.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 116
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Ne pouvez-vous pas tout simplement imbriquer les deux requêtes que vous avez écrites ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
    La piste est intéressante. J'ai essayé en Access et j'ai un message "Erreur de syntaxe dans la clause FROM". Peut-être que le JOIN (SELECT ... ) dans un FROM n'est pas supporté par Access.
    Une alternative ?

  7. #7
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonjour

    Citation Envoyé par voxov Voir le message
    Je suis devant un cas apparemment simple qui défie les possibilités du sql.
    C’est un cas qui ne pose aucune difficulté en SQL, sauf manifestement dans sa variante bridée ACCESS : vos deux requêtes "qMaxTaux1" et "qMaxTaux2" ont été tout simplement réunies en une seule par Waldar et cette dernière requête est valide avec tous les SGBD (à part un apparemment...) : si elle n’est pas exploitable avec ACCESS c’est que celui-ci est retard de quelques trains, en ayant oublié que dans un FROM on peut fournir plus qu’une simple liste de noms de tables (une requêtes ACCESS y comptant syntaxiquement pour une table), mais une liste d’expressions de tables de la forme (SELECT ... FROM...etc.) AS t.
    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é).

    ACCESS se comporte comme si en algèbre on ne pouvait pas emboîter des expressions dans une expression, au mépris de la propriété de fermeture... C’est ce qui avait fait réagir Hugh Darwen il y a déjà 25 ans de cela.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  8. #8
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Peut-être quelque chose comme ça conviendrait aussi :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 116
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    Peut-être quelque chose comme ça conviendrait aussi :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
    Oui, cette requête donne le bon résultat en Access 2003.
    Merci.

  10. #10
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par voxov Voir le message
    Bonjour,

    Je suis devant un cas apparemment simple qui défie les possibilités du sql.

    Les données : table "Referentiel"

    SiteRisque SiteComptable Taux AAA 123 0,33 ABC 123 0,22 DEF 123 0,11 GHV 123 0,33 IJB 678 0,80 QSD 123 0,33 UJK 678 0,45 UNF 890 0,99 YGV 890 0,25

    L'objectif :
    Sortir la liste des SiteRisque qui ont le taux maximal, par SiteComptable. S'il y a plusieurs SiteRisque qui ont le même taux maximal par SiteComptable, prendre le SiteRisque minimum parmi ces SiteRisque.

    Sur les données ci-dessus, le résultat est le suivant :

    SiteComptable SiteRisque 123 AAA 678 IJB 890 UNF
    En Access, j'obtiens le résultat avec 2 requêtes.

    ......................

    V.
    Voici la requete, ca va t'aider
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MinDeSiteRisque    SiteComptable
    AAA                123
    IJB                678
    UNF                890
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  11. #11
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    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.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  12. #12
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonsoir,

    Me suis emballé j'ai mi +1 à @islamov2000, c'était pour @fsmrel au final....

    ....
    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 116
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par islamov2000 Voir le message
    Voici la requete, ca va t'aider
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MinDeSiteRisque    SiteComptable
    Oui, c'est bon en Access aussi.
    Contrairement à ce que j'avais observé hier, cela prouve que Access supporte le JOIN (SELECT ...) dans une clause FROM. Simplement, il faut mettre "INNER JOIN", pas seulement "JOIN" sinon message d'erreur.
    Merci.

  14. #14
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    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".
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  15. #15
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    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 SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :



    Mais à l’exécution de la requête, on a droit au message :



    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 :



    Ç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 Voir le message
    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 :




    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 :




    Et MS SQL Server fournit les exemples qui vont bien :




    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 Voir le message
    Peut-être quelque chose comme ça conviendrait aussi :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    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 Voir le message
    Voici la requete, ca va t'aider
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 Voir le message
    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 Voir le message
    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.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requête SQL en mode challenge
    Par su4p aka dans le forum Langage SQL
    Réponses: 10
    Dernier message: 12/12/2013, 18h41
  2. Requête sql challenge 2
    Par voxov dans le forum Langage SQL
    Réponses: 9
    Dernier message: 09/10/2013, 14h41
  3. [ DB2 ] [ AS400] requête sql
    Par zinaif dans le forum DB2
    Réponses: 6
    Dernier message: 23/08/2008, 19h42
  4. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  5. Requête SQL
    Par Leludo dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/02/2003, 16h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo