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 :

Auto-jointure, bonne idée ?


Sujet :

Langage SQL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    783
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 783
    Points : 437
    Points
    437
    Par défaut Auto-jointure, bonne idée ?
    Bonjour
    j'aurai besoin d'aide pour écrire une requête SQL. Je ne vois pas trop comment la faire

    Tout d'abord voici un exemple de données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    id   from_d        to_d    fk_id
    1     a              b      1
    2     b              c      2
    3     a              b      2
    4     c              d      1
    5     c              d      1
    6     b              c      3
    Mon but est d'obtenir tout les lignes ayant from_d + to_d qui se répète
    et qui ont au moins une fois fk_id = 1 (donc id = 1, 3, 4 et 5) sans doublons

    J'ai fais cette requête :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select distinct from_d, to_d 
    from maTable m1 INNER JOIN maTable m2 
    ON m1.from_d = m2.from_d AND m1.to_d = m2.to_d AND m1.id <> m2.id
    WHERE  m1.fk_id = 1

    cette requête me parait pas une bonne manière de faire.
    Quel votre avis ?
    Le savoir est une arme alors soyons armés

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    utilisez un group by avec une clause having (pour la condition fk_id = 1)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    783
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 783
    Points : 437
    Points
    437
    Par défaut
    si je fais ça, je perd les ligne id = 1 et 3 alors que je les voudrai (from_d et to_d sont les mêmes pour ces deux lignes et pour la ligne id=1, fk_id = 1)

    rappel : le but est d'avoir tout les doublons ayant au moins une fois fk_id = 1
    Le savoir est une arme alors soyons armés

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Je ne vois pas bien ce que vous perdez par rapport à votre requete actuelle.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    783
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 783
    Points : 437
    Points
    437
    Par défaut
    vous remplaceriez l'auto jointure par le group by + having ou uniquement le where ?
    j'ai peut être mal compris votre conseil


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT from_d , to_d , fk_id
    FROM maTable
    GROUP BY from_d , to_d


    résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    from_d 	to_d 	fk_id
    a 	b 	1
    c 	d 	1

    edit: je viens de tester et effectivement ça renvoie la même chose
    Je vais vérifier que je n'ai pas des cas étranges
    Le savoir est une arme alors soyons armés

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    783
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 783
    Points : 437
    Points
    437
    Par défaut
    en ajoutant un count(*) > 1 pour éviter d'avoir les lignes n'apparaissant qu'une fois, ça semble répondre à mon attente

    Merci pour l'aide
    Le savoir est une arme alors soyons armés

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 778
    Points
    30 778
    Par défaut
    Tu peux aussi utiliser EXISTS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT  m1.from_d
        ,   m1.to_d 
    FROM    maTable m1
    WHERE   EXISTS
            (   SELECT  NULL
                FROM    maTable m2
                WHERE   m2.from_d   = m1.from_d
                    AND m2.to_d     = m1.to_d
                    AND m2.fk_id    = 1
            )
    GROUP BY m1.from_d
        ,   m1.to_d
    HAVING  COUNT(*) > 1
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Citation Envoyé par Nom Voir le message
    vous remplaceriez l'auto jointure par le group by + having ou uniquement le where ?
    j'ai peut être mal compris votre conseil
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT from_d , to_d
    FROM maTable
    GROUP BY from_d , to_d
    HAVING SUM(CASE WHEN FK_ID = 1 THEN 1 ELSE 0 END) > 0 AND COUNT(*) > 1

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

Discussions similaires

  1. Auto jointure complexe
    Par ricobye dans le forum Langage SQL
    Réponses: 11
    Dernier message: 19/01/2006, 17h02
  2. [FLASH] Coupler html et flash ? Bonne idée ?
    Par psycomel dans le forum Flash
    Réponses: 14
    Dernier message: 06/12/2005, 14h10
  3. Trier la hierarchie d'une auto-jointure
    Par Oberown dans le forum Langage SQL
    Réponses: 8
    Dernier message: 17/10/2005, 17h18
  4. resultat d'une auto jointure
    Par slc dans le forum Requêtes
    Réponses: 6
    Dernier message: 30/09/2004, 14h54
  5. Auto jointure speciale
    Par kv000 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 14/04/2004, 14h02

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