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 avec sous requête *remplacée par double jointure


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 23
    Points : 15
    Points
    15
    Par défaut Requête avec sous requête *remplacée par double jointure
    Salut à tous,

    j'ai deux tables



    TABLES :

    type_matérielle :

    id_type_materielle______type_materielle
    _______ 1 _______ _______ _______ PC _______
    _______ 2 _______ _______ _______ HDD ______
    _______ 3 _______ _______ _______ CPU ______
    _______ 4 _______ _______ _______ MB _______
    _______ 5 _______ _______ _______ RAM ______




    type_d1_type :

    id_type_d1_type ____ id_type_materielle ____ id_type_materielle2
    ______ 1 _________________ 1 ____________________ 2 ______
    ______ 2 _________________ 1 ____________________ 3 ______
    ______ 3 _________________ 1 ____________________ 4 ______
    ______ 4 _________________ 1 ____________________ 5 ______
    ______ 5 _________________ 1 ____________________ 5 ______

    je voudrais donc récupérer par une requête tous les types associés au type PC, ce qui donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TypePC
    ---------------
    HDD
    CPU
    MB
    RAM
    RAM
    J'ai essayer différentes requêtes mais je ne parviens pas à trouver celle qui m'affichera le bon résultat :

    Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT type_d1_type.id_type_materielle2 as TypePC
    FROM type_materielle,type_d1_type 
    WHERE type_materielle.id_type_materielle=1 
      AND type_materielle.id_type_materielle = type_d1_type.id_type_materielle
    ce qui m'affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Mat
    -------
    2
    3
    4
    5
    5
    Mais ceci est l'id et non le type associé.

    J'ai donc fait une autre requête qui m'en approche mais toujours fausse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT type_materielle 
    FROM type_materielle
    WHERE id_type_materielle IN ( 
      SELECT type_d1_type.id_type_materielle2 
      FROM type_materielle,type_d1_type 
      WHERE type_materielle.id_type_materielle=1 
        AND type_materielle.id_type_materielle = type_d1_type.id_type_materielle )
    ce qui me donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    type_materielle
    ------------------
    HDD
    CPU
    MB
    RAM
    Il me manque donc un ligne RAM


    SOLUTION

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT tm2.type_materielle
    FROM (type_materielle tm1
     
        INNER JOIN type_d1_type d1
          ON d1.id_type_materielle = tm1.id_type_materielle)
     
        INNER JOIN type_materielle tm2
          ON tm2.id_type_materielle = d1.id_type_materielle2
     
    WHERE
        tm1.type_materielle = 'PC'
    Merci encore à tous pour votre aide.

  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 768
    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 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Donnez nous la description de vos tables sous forme DDL comme indiqué dans la charte de postage : http://www.developpez.net/forums/a69...gage-sql-lire/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Matériel est un nom masculin qui ne s'écrit pas avec 'elle' à la fin !

    Une petite jointure, écrite selon la syntaxe normalisée depuis 1992, devrait faire l'affaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT tm.type_materielle AS Mat
    FROM type_materielle AS tm
    INNER JOIN type_d1_type AS d1 ON tm.id_type_materielle = d1.id_type_materielle
    WHERE d1.id_type_materielle = 1
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    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
    Il manque une jointure Cinephil !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT
        tm2.type_materiel
    FROM
        type_materiel tm1
        INNER JOIN type_d1_type d1
          ON d1.id_type_materiel = tm1.id_type_materiel
        INNER JOIN type_materiel tm2
          ON tm2.id_type_materiel = d1.id_type_materiel2
    WHERE
        tm1.type_materiel = 'PC'

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Merci pour vos réponses.

    Je vais corriger ça pour "materielle" (c'est vrai que j'ai fait ça un peu à la va vite pour ne pas reprendre mes vraies tables)

    Après avoir testé je mettrai je l'espère un [résolu] dans mon titre.

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Il manque une jointure Cinephil !
    Ben non puisque dans sa (première) requête il connaît déjà l'ID du PC (1) et que cet ID figure en clé étrangère dans la table 'type_d1_type'.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    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
    J'ai trouvé deux erreurs dans votre requête :
    • le besoin est de trouver les types associés au type PC, pas les types associés à l'id 1
    • il faudrait faire la jointure sur id_type_materielle2 pour que votre requête fonctionne, erreur dont vous vous seriez rendu compte si vous aviez fait les deux jointures !

  8. #8
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Un grand MERCI Waldar pour t'être penché sur mon problème, c'est tout à fait ce dont j'avais besoin.
    Grace à toi je sais maintenant que je dois me remettre sérieusement au SQL. (plus précisément sur les jointures)

    Bonne journée à tous.

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

Discussions similaires

  1. Requête avec Sous Requête DMAx, problème ajout
    Par charliejo dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 26/02/2014, 10h48
  2. [AC-2010] requête et sous-requête avec paramètres
    Par Ragmaxone dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 17/12/2012, 17h37
  3. Réponses: 4
    Dernier message: 29/07/2009, 14h19
  4. requête avec sous-requête
    Par supernicoco dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 17/02/2009, 09h03
  5. Requête et sous requête avec SELECT et UPDATE
    Par Véronique75ca dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 29/06/2006, 21h25

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