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 :

intersect et having


Sujet :

Langage SQL

  1. #1
    Membre régulier Avatar de Goldocrack
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 126
    Points : 112
    Points
    112
    Par défaut intersect et having
    Salut à tous et bonne année !

    Après de nombreux essais (intersect et requête inner) je vous expose mon problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT `champlememe` FROM `tablelameme` WHERE `condition1`=200 AND `condition2`<60 
    INTERSECT 
    SELECT `champlememe` FROM `tablelameme` GROUP BY `condition3` WHERE HAVING COUNT(`champlememe`)>1
    Je n'arrive pas à faire fonctionner cette requête (erreur) alors que les 2 fonctionnent séparément.


    En désespoir de cause j'ai essayé de passer par une autre méthode en utilisant que des termes conventionnés mais seul les résultats de la première partie de la requête ressortent en résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT `champlememe` FROM `tablelameme` GROUP BY `condition3` HAVING COUNT(`champlememe`)>1 
    AND EXISTS
    (SELECT `champlememe` FROM `tablelameme` WHERE `condition1`=200 AND `condition2`<60)
    J'ai aussi tenté de rajouté à la fin "AND `champlememe`=`champlememe` (en mettant des alias sur la première et la deuxième requête mais les résultats sont toujours ceux de la première requête.


    Merci beaucoup pour votre aide !

  2. #2
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    Citation Envoyé par Goldocrack Voir le message
    Après de nombreux essais (intersect et requête inner) je vous expose mon problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT `champlememe` FROM `tablelameme` WHERE `condition1`=200 AND `condition2`<60 
    INTERSECT 
    SELECT `champlememe` FROM `tablelameme` GROUP BY `condition3` WHERE HAVING COUNT(`champlememe`)>1
    Je n'arrive pas à faire fonctionner cette requête (erreur) alors que les 2 fonctionnent séparément.
    salut,

    quelle erreur? quel SGBD?

    de plus je suis étonné que ta 2ème requete fonctionne.
    Je l'écrirais comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT `champlememe` FROM `tablelameme` GROUP BY `condition3` HAVING COUNT(`champlememe`)>1

  3. #3
    Membre régulier Avatar de Goldocrack
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 126
    Points : 112
    Points
    112
    Par défaut
    Salut et merci de ta réponse

    Citation Envoyé par Cybher Voir le message
    de plus je suis étonné que ta 2ème requete fonctionne.
    Je l'écrirais comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT `champlememe` FROM `tablelameme` GROUP BY `condition3` HAVING COUNT(`champlememe`)>1
    Effectivement, la requête ne fonctionnait pas (mais ce n'était qu'une erreur de copier coller), mais même après la correction le problème reste. Apparemment c'est la requête INTERSECT qui ne fonctionne pas (c'est pourquoi j'ai essayé la deuxième solution).

    Citation Envoyé par Cybher Voir le message
    quelle erreur? quel SGBD?
    La voici :
    "MySQL a répondu:
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INTERSECT ( SELECT `ehpFiness` FROM `tblehpa20071030` GROUP BY `ehpFinessJuridiq' at line 1 "

    Merci de votre aide, je reste encore embêtée (je précise que je ne dois pas mettre à jour le moteur SQL --> serveur informatique entreprise)

  4. #4
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 091
    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 091
    Points : 31 510
    Points
    31 510
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par Votre SGBD
    'INTERSECT ( SELECT `ehpFiness` FROM `tblehpa20071030` GROUP BY `ehpFinessJuridiq'
    Votre SGBD a raison, la colonne ehpFiness doit faire partie du GROUP BY...

  5. #5
    Membre régulier Avatar de Goldocrack
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 126
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    Votre SGBD a raison, la colonne ehpFiness doit faire partie du GROUP BY...
    Je ne comprends pas pourquoi ma colonne ehpFiness doit faire partie du GROUP BY (ni même comment l'y intégrer)

    ma requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT `ehpFiness` FROM `tblehpa20071030` WHERE `ehpCodeCategorie`=200 INTERSECT SELECT `ehpFiness` FROM `tblehpa20071030` GROUP BY `ehpFinessJuridique` HAVING COUNT(`ehpFiness`)>1
    Je recherche les résultats identiques sortant des deux requêtes :
    • la 1ère ayant un code de catégorie égal à 200
    • la 2nde permet de connaitre les clés primaires ehpFiness qui ont en relation au moins un autre numéro ehpFiness ayant le même numéro ehpFinessJuridique


    Merci de m'éclairer sur ce point

  6. #6
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    Citation Envoyé par Goldocrack Voir le message
    Je ne comprends pas pourquoi ma colonne ehpFiness doit faire partie du GROUP BY (ni même comment l'y intégrer)
    Toute dimension existant dans un SELECT doit forcément être répétée dans le GROUP BY, comme le dit fsmrel, c'est une règle de l'écriture du GROUP BY (le contraire n'est pas obligatoire).


    Citation Envoyé par Goldocrack Voir le message
    la 2nde permet de connaitre les clés primaires ehpFiness qui ont en relation au moins un autre numéro ehpFiness ayant le même numéro ehpFinessJuridique
    Je ne suis pas sûr de comprendre la demande car les noms de colonnes sont moyennement parlant.
    et ça ? (pour la 2é partie après l'INTERSECT) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT  `ehpFiness`  
    FROM  `tblehpa20071030` 
    WHERE `ehpFinessJuridique` 
    IN  (
          SELECT `ehpFinessJuridique` 
          FROM `tblehpa20071030` 
          GROUP BY `ehpFinessJuridique` 
          HAVING COUNT(*)>1
          )

  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 091
    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 091
    Points : 31 510
    Points
    31 510
    Billets dans le blog
    16
    Par défaut
    Je ne comprends pas pourquoi ma colonne ehpFiness doit faire partie du GROUP BY (ni même comment l'y intégrer)
    SQL est ainsi fait, nous n'y pouvons rien et tous les SGBD utilisant SQL vous sortiront une injure du même calibre que celle à laquelle vous avez eu droit...

    Quand vous dites :

    connaitre les clés primaires ehpFiness qui ont en relation au moins un autre numéro ehpFiness ayant le même numéro ehpFinessJuridique
    Imaginez alors que la table tblehpa20071030 ait une soeur jumelle : automatiquement vous serez ammenée à effectuer une jointure entre ces deux tables, avec comme condition même ehpFinessJuridique et numéro ehpFiness distinct.

    Le Select correspondant devient le suivant (le DISTINCT n'est pas strictement nécessaire, mais avec SQL on ne sait jamais et ça ne mange pas de pain) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT  DISTINCT a.ehpFiness
    FROM   tblehpa20071030 a,
           tblehpa20071030 b
    WHERE  a.ehpFinessJuridique = b.ehpFinessJuridique
    And    a.ehpFiness <> b.ehpFiness
    Et la requête complète :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT   ehpFiness
    FROM     tblehpa20071030
    WHERE    ehpCodeCategorie = 200
    INTERSECT
    SELECT  DISTINCT a.ehpFiness
    FROM   tblehpa20071030 a,
           tblehpa20071030 b
    WHERE  a.ehpFinessJuridique = b.ehpFinessJuridique
    And    a.ehpFiness <> b.ehpFiness
    En plus, pendant que je réponds, phili_b vous propose une alternative :
    Abondance de biens ne nuit pas... Et n'hésitez pas à décortiquer tout cela.

  8. #8
    Membre régulier Avatar de Goldocrack
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 126
    Points : 112
    Points
    112
    Par défaut
    Bonjour,

    Citation Envoyé par fsmrel
    Votre SGBD a raison, la colonne ehpFiness doit faire partie du GROUP BY...
    Après test (et même si apparemment ce n'est pas très conventionnel), le résultat de la requête sans inclure ehpFiness dans le GROUP BY fonctionne. Comme cette requête ne sera pas utilisée dans un script mais uniquement ponctuellement pour une recherche d'information à la main, nous passerons outre.

    Alors apparemment ma version ne doit pas supporter INTERSECT car aucune des requêtes ne fonctionne.
    J'ai donc tenté une version simplifiée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(`ehpFiness`) FROM `tblehpa20071030` WHERE `ehpCodeCategorie`=200 AND `ehpFiness` IN (SELECT `ehpFiness` FROM `tblehpa20071030` GROUP BY `ehpFinessJuridique` HAVING COUNT(`ehpFiness`)>1)
    Le problème provient maintenant du fait que la table tblehpa20071030 contient environ 10 000 enregistrements, donc si je comprends bien le fonctionnement de cette requête il va falloir 10 000 fois le temps de ma requête IN () pour me pondre un résultat.

    Personne n'aurait une idée de comment faire accélérer les choses ?

  9. #9
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 091
    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 091
    Points : 31 510
    Points
    31 510
    Billets dans le blog
    16
    Par défaut
    Bonjour Goldocrack,


    Vous écrivez :
    la table tblehpa20071030 contient environ 10 000 enregistrements, donc si je comprends bien le fonctionnement de cette requête il va falloir 10 000 fois le temps de ma requête IN () pour me pondre un résultat.
    Vous tenez un propos qui n'est pas en adéquation avec le comportement des SGBDR normalement constitués...

    Peu importe. Votre SGBD ne reconnaît pas l'opérateur INTERSECT ? Soit, on va considérer que la face nord est inaccessible...
    Mais on peut tenter la face sud, puisque qu'une intersection correspond logiquement à un ET. Comme on ne peut pas écrire :
    SELECT AND SELECT
    (SQL est assez biscornu et en l'occurrence asymétrique), on peut essayer :
    SELECT AND EXISTS (SELECT) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT   ehpFiness
    FROM     tblehpa20071030
    WHERE    ehpCodeCategorie = 200
    And Exists
    (
     SELECT  a.ehpFiness
     FROM    tblehpa20071030 a,
             tblehpa20071030 b
     WHERE   a.ehpFinessJuridique = b.ehpFinessJuridique
      And    a.ehpFiness <> b.ehpFiness
    ) ;

  10. #10
    Membre régulier Avatar de Goldocrack
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 126
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    Vous tenez un propos qui n'est pas en adéquation avec le comportement des SGBDR normalement constitués...
    Je ne sais pas si ma SGBDR est normalement constituée mais ma requête précédente a mis 54 minutes à me donner un résultat


    Citation Envoyé par fsmrel Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT   ehpFiness
    FROM     tblehpa20071030
    WHERE    ehpCodeCategorie = 200
    And Exists
    (
     SELECT  a.ehpFiness
     FROM    tblehpa20071030 a,
             tblehpa20071030 b
     WHERE   a.ehpFinessJuridique = b.ehpFinessJuridique
      And    a.ehpFiness <> b.ehpFiness
    ) ;
    Effectivement cette requête fonctionne très bien, il ne me reste plus qu'une chose à demander, avec le HAVING COUNT le problème ne se posait pas mais là...

    Dans ce cas là, au moins deux champs ehpFiness ont en commun un ehpFinessJuridique... mais si je souhaite rechercher le cas où au moins 10 champs ehpFiness ayant en commun le même ehpFinessJuridique comment puis-je faire ??

    Une solution horrible (mais qui, je pense, fonctionnerait) serait d'écrire 10 fois la condition citée ci-dessus mais je compte réitérer l'opération ensuite avec la condition au moins 100 etc.

    Merci de votre aide pour clôturer ce sujet.

  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 091
    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 091
    Points : 31 510
    Points
    31 510
    Billets dans le blog
    16
    Par défaut
    Dans ce cas là, au moins deux champs ehpFiness ont en commun un ehpFinessJuridique... mais si je souhaite rechercher le cas où au moins 10 champs ehpFiness ayant en commun le même ehpFinessJuridique
    Il n'y a en réalité qu'une seule table et qu'un seul champ ehpFiness, en revanche un nombre indéterminé de lignes de la table peuvent avoir des valeurs distinctes pour ehpFiness, avec même valeur pour ehpFinessJuridique.


    Je ne sais pas si ma SGBDR est normalement constituée mais ma requête précédente a mis 54 minutes à me donner un résultat
    Je ne connais pas votre SGBDR, mais il doit vous proposer une instruction EXPLAIN vous permettant d'établir un diagnostic quant à cette mauvaise performance. A vous de réorganiser votre table, de provoquer la mise à jour des données statistiques dans le catalogue relationnel, de mettre en oeuvre les index nécessaires, puis de relancer des campagnes d'EXPLAIN jusqu'à ce tout cela vous paraisse correct, en sorte qu’à leur tour les temps de réponse deviennent satisfaisants. Les bases de données relationnelles, c'est comme les Formule 1, ça demande parfois des réglages très minutieux, de la part de mécaniciens de préférence très au courant. On les appelle des DBA...

  12. #12
    Membre régulier Avatar de Goldocrack
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 126
    Points : 112
    Points
    112
    Par défaut
    Concernant ma BDD elle se porte bien, c'est uniquement mon ancienne requête qui était vraiment très mal tournée...

    Citation Envoyé par fsmrel Voir le message
    Il n'y a en réalité qu'une seule table et qu'un seul champ ehpFiness, en revanche un nombre indéterminé de lignes de la table peuvent avoir des valeurs distinctes pour ehpFiness, avec même valeur pour ehpFinessJuridique.
    J'avais très bien compris le principe mais c'est pourquoi je me demande comment réaliser la même requête mais en ayant la possibilité de poser une condition sur le nombre de valeurs distinctes pour ehpFiness ayant la même valeur ehpFinessJuridique...

  13. #13
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 091
    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 091
    Points : 31 510
    Points
    31 510
    Billets dans le blog
    16
    Par défaut
    je me demande comment réaliser la même requête mais en ayant la possibilité de poser une condition sur le nombre de valeurs distinctes pour ehpFiness ayant la même valeur ehpFinessJuridique
    Il est un fait que la technique des tables jumelles vaut pour déterminer l'existence d'une situation, mais pas pour compter.

    Si on veut savoir quelles sont les (au moins) 100 ehpFiness impliquées, alors mieux vaut effectivement en passer par une requête permettant de compter et énumérer :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    SELECT   ehpFiness
    FROM     tblehpa20071030
    WHERE    ehpCodeCategorie = 200
    And 
    Exists
    (
    SELECT  a.ehpFiness
    FROM   tblehpa20071030 a
    where Exists
          (
           SELECT  b.ehpFinessJuridique
           FROM    tblehpa20071030 b
           Where   a.ehpFinessJuridique = b.ehpFinessJuridique
           Group by b.ehpFinessJuridique
           having Count(*) >= 100
          )
    ) ;

  14. #14
    Membre régulier Avatar de Goldocrack
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 126
    Points : 112
    Points
    112
    Par défaut
    Bonsoir,

    Je vous remercie de votre aide concernant la résolution du problème ci-dessus


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

Discussions similaires

  1. Intersection entre 2 triangles?? (3D)
    Par supergrey dans le forum DirectX
    Réponses: 1
    Dernier message: 25/08/2004, 09h22
  2. EXCEPT et INTERSECT sous MS SQLServer ?
    Par christie dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/05/2004, 16h47
  3. GROUP BY et HAVING dans un UPDATE
    Par MashiMaro dans le forum Langage SQL
    Réponses: 3
    Dernier message: 26/08/2003, 08h03
  4. [prg jeux ]Définir l'intersection de deux rectangles
    Par mat.M dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 30/07/2003, 18h11
  5. XPath: intersection de chemins
    Par aldo047 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 13/03/2003, 10h30

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