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 :

Requete SQL entre 2 tables liés par une relation many to many


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Requete SQL entre 2 tables liés par une relation many to many
    Bonjour,
    J'ai une question de SQL que je n'arrive pas à résoudre.
    Voici un exemple.

    J'ai une classe Parent avec un nom, un prénom, et une collection "enfants". La classe enfant mettons qu'il y a juste un prénom.

    Les deux classes sont liés par un lien "many to many". (1..n en français donc).

    Voici le type de requete que je voudrais exécuter : "donne moi toutes les personnes qui ont des enfants nommés Jean et Marie". Attention Jean ET Marie. Donc les personnes doivent avoir au moins deux enfants : un Jean et une Marie.
    Logiquement ça peut donc retourner plusieurs personnes.

    Voilà j'ai simplifé mon application est bien plus complexe mais si j'arrive à le faire avec des personnes et des enfants, je pourrai adapter ! J'utilise hibernate si y'en a qui connaissent. Mais je recherche la requete SQL,
    j'adapterai ensuite.

    Merci beaucoup pour votre aide !!

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Vous pouvez vous inspirer de ce fil, c'est la même problématique :
    http://www.developpez.net/forums/d73...table-liaison/

  3. #3
    Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Je vais regarder ça plus en détails et je vous dirai si cela répond à ma question.
    Merci.

  4. #4
    Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour,
    J'ai bien regardé ce lien.
    C'est effectivement une astuce à laquelle je n'avais pas pensé.

    J'ai cependant une question. Je n'ai pas directement l'id de la catégorie (je continue sur l'exemple donné dans l'autre discussion). J'ai par exemple le titre de la catégorie.

    Peut-on mettre une requête select à l'intérieur de la clause "in" ?
    Avez-vous une idée ?

    Merci par avance.

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Aucun problème pour mettre une sous-requête dans le IN.

    Il faudra aussi remplacer le 2 du having par un count(*) avec les mêmes critères que votre sous-requête.

  6. #6
    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 n'ai pas été voir le lien, mais je vous propose de mon côté quelque chose comme cela :


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Select *
    from Parent as x
    where exists (select *
                  from   (select y.Parentid 
                          from   Enfant as y Inner join Enfant as z
                                        on y.ParentId = z.ParentId
                          where  y.Prenom = 'Jean' and z.Prenom = 'Marie') as t
                  where x.Parentid = t.Parentid)
    ;

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 849
    Points : 52 975
    Points
    52 975
    Billets dans le blog
    6
    Par défaut
    Incompréhensible car votre énoncé est déjà faux à la base :
    Les deux classes sont liés par un lien "many to many". (1..n en français donc).
    1..n signifie lien de 1 à plusieurs.
    many to many signifie plusieurs à plusieurs
    Cherchez l'erreur !

    Enfin la notion de classe n'existe pas en matière de BD. On parle de table (physique) ou de relations (logique).

    A +

  8. #8
    Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Alors c'est une relation many to many.
    Et effectivement ce ne sont pas des classes mais avec hibernate on travaille avec les classes et non avec les tables de la base de données. C'est pour ça que c'est plus compliqué que du SQL simple.

    Mais si j'arrive à avoir une requete en SQL, je pourrai l'adapter. Enfin j'espère !

  9. #9
    Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci Waldar, je vais utiliser ce que vous avez fait et mettre une requete dans la clause IN.

    Je dois adapter tout ça en HQL pour le faire marcher sous hibernate. Mais apparemment c'est bien possible.

    J'essaierai de poster un message avec les requêtes HQL et SQL finales.

    Merci pour votre aide !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/09/2009, 11h57
  2. Réponses: 2
    Dernier message: 25/05/2009, 15h53
  3. Deux sous-formulaire liés par une relation 1 à 1
    Par Elnino38 dans le forum VBA Access
    Réponses: 7
    Dernier message: 10/04/2008, 17h26
  4. requete sql pour vider le contenu d'une colonne d'une table
    Par Sheppard38 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 26/06/2007, 14h20
  5. [REQUETE] Configuration de la table créée par une requete
    Par NiKoTiNe dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 08/05/2007, 08h37

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