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 :

Conception d'une requête SQL


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 12
    Par défaut Conception d'une requête SQL
    Bonjour à tous,

    J'ai une question technique sur la conception d'une requête SQL.
    Pour tenter d'être le plus clair possible, voici un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Table1 (
    Id (Entier)
    )
     
    Table2 (
    	<div style="margin-left:40px">IdTable1 (Entier)
    	Attribut (Entier)</div>)
    Le champs IdTable1 est une clé étrangère qui référence Table1.id.
    La clé primaire de Table2 est IdTable1 et Attribut.


    Exemple de jeu de valeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Table1
     
    0
    1
     
    Table2 
     
    0     1
    0     4
    0     5
    1     1
    1     2
    1     3
    1     5

    Je souhaite conaitre tous les éléments de table1 pour qui possèdent Attribut = 3 ET Attribut = 5.

    Ma requête est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT t1.Id
    FROM Table1 t1, Table2 t2
    WHERE t2.IdTable1 = t1.Id
    	AND t1.ID IN (
    		SELECT t1.Id
    		FROM Table1 t1, Table2 t2
    		WHERE t2.IdTable1 = t1.Id
    			AND t2.Attribut = 3)
    	AND t1.ID IN (
    		SELECT t1.Id
    		FROM Table1 t1, Table2 t2
    		WHERE t2.IdTable1 = t1.Id
    			AND t2.Attribut = 5);
    Dans mon exemple, la requete doit renvoyer l'élément de table1 ayant l'Id "1".
    Existe t'il des moyens plus simples d'obtenir le même résultat, sans sous requêtes?
    Ma façon de faire peut poser problème si on imagine que j'ai 20 sous requêtes à faire.

    Merci pour votre aide

    Robin

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 135
    Par défaut
    Cela peut être nettement simplifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT  t1.id
    FROM    table1  AS t1
    WHERE   EXISTS
            (   SELECT  1
                FROM    table2  AS t2
                WHERE   t2.idtable1 = t1.id
                    AND t2.attribut IN (3,5)
                HAVING  COUNT(*) = 2
            )
    ;
    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.

  3. #3
    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 : 42
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Cela peut être nettement simplifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT  t1.id
    FROM    table1  AS t1
    WHERE   EXISTS
            (   SELECT  1
                FROM    table2  AS t2
                WHERE   t2.idtable1 = t1.id
                    AND t2.attribut IN (3,5)
                HAVING  COUNT(*) = 2
            )
    ;
    il ne manque pas un 'group by' avant la clause 'having'?

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 135
    Par défaut
    Citation Envoyé par Cybher Voir le message
    il ne manque pas un 'group by' avant la clause 'having'?
    Sur quelle(s) colonne(s) ?
    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.

  5. #5
    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 : 42
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Par défaut
    Je fais peut etre une erreur mais il me semblait qu'il fallait faire un regroupement pour utiliser la clause having


    moi j'aurais fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT  t1.id
    FROM    table1  AS t1
    WHERE   t1.id in
            (   SELECT  t2.idtable1
                FROM    table2  AS t2
                WHERE  t2.attribut IN (3,5)
                GROUP BY (t2.idtable1)
                HAVING  COUNT(*) = 2
            )
    ;
    mais c'est certainement moin optimisé que ta solution

  6. #6
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 12
    Par défaut
    Merci beaucoup pour votre aide.
    C'est astucieux, je n'y avais pas pensé! Preuve que j'ai encore pas mal à en apprendre en SQL!

    A bientôt!

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

Discussions similaires

  1. Réponses: 18
    Dernier message: 24/07/2012, 15h08
  2. SQL: Conception d'une requête
    Par claralavraie dans le forum Langage SQL
    Réponses: 3
    Dernier message: 24/01/2006, 16h57
  3. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  4. Résultat d'une requète SQL
    Par camino dans le forum Bases de données
    Réponses: 2
    Dernier message: 21/02/2004, 15h22
  5. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26

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