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 :

[Jointure] [Débutant] méta modèle


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 258
    Points : 171
    Points
    171
    Par défaut [Jointure] [Débutant] méta modèle
    Bonjour,
    J'ai une question de débutant, j'ai trois tables
    1) Voiture : colonnes (voiture_id,type + ...)
    2) InfoValeur : colonnes (voiture_id, info_id, valeur)
    3) Info: colonnes (info_id, description + ...)

    Voici le type d'info que l'on peut trouver dans la table Info:
    AnneeCommercialisation,
    PoidsVehicule,
    Couleur ...

    Je souhaite effectuer une requête dans ces trois tables qui me permette par exemple de récupérer la ou les voitures qui ont pour type (x,y,z) dont la AnneeCommercialisation> '2003' et AnneeCommercialisation < '2006' et PoidsVehicule < 1500 et
    Couleur = 'rouge'.

    Je n'arrive pas à formaliser ma requête en SQL si qqu'un peut m'aider.

    Merci

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 902
    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 902
    Points : 51 646
    Points
    51 646
    Billets dans le blog
    6
    Par défaut
    S'agissant d'un méta modèle il faut un couple de jointure info / infovaleur par conditons :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    SELECT DISTINCT V.*
     
    FROM   Voiture V
     
    -- jointure pour condition 1 : type (x,y,z)
           INNER JOIN InfoValeur IV1
                 ON V.voiture_id = IV1.voiture_id
           INNER JOIN Info I1
                 ON IV1.info_id = I1.info_id
     
    -- jointure pour condition 2 : AnneeCommercialisation > '2003' et AnneeCommercialisation < '2006' 
           INNER JOIN InfoValeur IV2
                 ON V.voiture_id = IV2.voiture_id
           INNER JOIN Info I2
                 ON IV2.info_id = I2.info_id
     
    -- jointure pour condition 3 : PoidsVehicule < 1500
           INNER JOIN InfoValeur IV3
                 ON V.voiture_id = IV3.voiture_id
           INNER JOIN Info I3
                 ON IV3.info_id = I3.info_id
     
    -- jointure pour condition 4 : Couleur = 'rouge'.
           INNER JOIN InfoValeur IV4
                 ON V.voiture_id = IV4.voiture_id
           INNER JOIN Info I4
                 ON IV4.info_id = I4.info_id
     
    -- type (x,y,z)
    WHERE  I1.description = 'type'
      AND  IV1.valeur IN (x, y, z)
     
    -- AnneeCommercialisation > '2003' et AnneeCommercialisation < '2006' 
      AND  I2.description = 'AnneeCommercialisation'
      AND  IV2.valeur BETWEEN '2004' AND '2005'
     
    -- PoidsVehicule < 1500
      AND  I3.description = 'PoidsVehicule'
      AND  IV3.valeur < '1500'
     
    -- Couleur = 'rouge'.
      AND  I4.description = 'Couleur'
      AND  IV4.valeur = 'rouge'
    A +

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 258
    Points : 171
    Points
    171
    Par défaut
    Merci beaucoup de ton aide,
    J'ai quelque question:

    1) Cela signifie qu'il faut que je définisse une jointure InfoValeur/Info à chaque fois que je rajoute un critère (couleur, date, poids ...) c'est ça ?

    2) dans la jointure InfoValeur/Info suivante et les autres aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    -- jointure pour condition 4 : Couleur = 'rouge'.
    INNER JOIN InfoValeur IV4
      ON V.voiture_id = IV4.voiture_id
      INNER JOIN Info I4
      ON IV4.IV = I4.IV
    le IV de correspond à quoi au info_id ?

    Merci.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 11
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    En fait d'après ce que j'ai compris tu as un champ 'description' dans la table Info qui va contenir ton type d'info (par exemple 'Couleur') et un champ 'valeur' dans la table InfoValeur qui va stocker le contenu de cette info (par exemple 'Rouge'), le lien entre les 2 se faisant par la clé info_id.
    Dans ce cas là tu vas utiliser autant de jointures entre une unique table Voiture et à la fois la table Info et la table InfoValeur qu'il ya de critères à considérer. Tu auras donc le "gros FROM" suivant :
    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
    FROM Voiture V
           INNER JOIN InfoValeur IV1
                 ON V.voiture_id = IV1.voiture_id
           INNER JOIN Info I1
                 ON IV1.info_id = I1.info_id
           INNER JOIN InfoValeur IV2
                 ON V.voiture_id = IV2.voiture_id
           INNER JOIN Info I2
                 ON IV2.info_id = I2.info_id
           INNER JOIN InfoValeur IV3
                 ON V.voiture_id = IV3.voiture_id
           INNER JOIN Info I3
                 ON IV3.info_id = I3.info_id
           INNER JOIN InfoValeur IV4
                 ON V.voiture_id = IV4.voiture_id
           INNER JOIN Info I4
                 ON IV4.info_id = I4.info_id
    (En effet, il ne s'agit pas de IV.IV = I.IV mais de IV.info_id = I.info_id).

    Par ailleurs, vu que tu exploites plusieurs fois tes tables Info et InfoValeur, tu dois donc définir des alias (I1 correspond à la table Info dans la 1ère jointure utilisée pour la condition type (x,y,z), ...., et IV4 correspond à la table InfoValeur utilisée dans la 4ème jointure pour la condition Couleur = 'rouge').

    Voilà en espérant t'avoir un peu éclairci..

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 902
    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 902
    Points : 51 646
    Points
    51 646
    Billets dans le blog
    6
    Par défaut
    Ou voit tu une erreur dans ma requête ????











































































    Bon, j'avoue avoir truandé un peu!!! ;-)

    A +

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 11
    Points : 13
    Points
    13
    Par défaut
    Dernière modification par SQLpro Aujourd'hui à 13h22.

    ... Oui il semblerait

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 258
    Points : 171
    Points
    171
    Par défaut
    Merci de votre aide.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 258
    Points : 171
    Points
    171
    Par défaut
    Bonjour, je viens de relancer ce post car j'ai encore une question sur la requête:
    En effet tous mes critères de recherche dans la clause where sont reliés par des AND, je souhaite les relier par des OR.

    Dans mon exemple je souhaite:
    Je souhaite récupérer la ou les voitures qui ont pour type (x,y,z) dont la AnneeCommercialisation> '2003 ou AnneeCommercialisation < '2006' ou PoidsVehicule < 1500 ou Couleur = 'rouge'.

    Je dois changer mes jointures ?

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 258
    Points : 171
    Points
    171
    Par défaut
    Bonjour, j'ai trouvé comment faire ma requête par contre avec les jointures, la requête est super longue.
    En conséquence de quoi, j'ai décidé de faire des select par critère et ensuite de faire une union.

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

Discussions similaires

  1. Une erreur 233 de ms sql server
    Par Hokage dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 05/10/2009, 17h40
  2. Erreur 233 sous sql server
    Par brajae85 dans le forum Oracle
    Réponses: 3
    Dernier message: 18/05/2009, 16h12
  3. Réponses: 2
    Dernier message: 05/10/2004, 22h43

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