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 :

[Oracle] Requêtes groupées


Sujet :

Langage SQL

  1. #1
    Membre éclairé Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Points : 770
    Points
    770
    Par défaut [Oracle] Requêtes groupées
    Bonjour,

    je suis calé sur un petit problème de réflexion.

    Voici mon schéma de tables

    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
    table CLIENT
    (NCLI char(4) not null,
     NOM  varchar(12) not null,
     ADRESSE varchar(20) not null,
     LOCALITE varchar(12) not null,
     CAT char(2),
     COMPTE decimal(9,2) not null,
     primary key (NCLI));
     
    table PRODUIT
    (NPRO char(5) not null,
     LIBELLE varchar(20) not null,
     PRIX decimal(5,0) not null,
     QSTOCK decimal(6,0) not null,
     primary key (NPRO));
     
    table COMMANDE
    (NCOM char(5) not null,
     NCLI char(4) not null,
     DATECOM date not null,
     primary key (NCOM),
     foreign key (NCLI) references CLIENT);
     
     table DETAIL
    (NCOM char(5) not null,
     NPRO char(5) not null,
     QCOM decimal(4,0) not null,
     primary key (NCOM,NPRO),
     foreign key (NCOM) references COMMANDE,
     foreign key (NPRO) references PRODUIT);

    j'ai quelques requêtes à effectuer,

    notamment:

    4.19 Afficher le numéro et le libellé des produits en sapin :

    A. Qui ne sont pas commandés

    pas trop de soucis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT LIBELLE FROM PRODUIT WHERE NPRO NOT IN(SELECT NPRO FROM DETAIL) AND LIBELLE like '%SAPIN%'
    B. Qui ont été commandés à Toulouse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT LIBELLE FROM PRODUIT WHERE NPRO IN(SELECT NPRO FROM DETAIL where NCOM IN(SELECT NCOM FROM COMMANDE WHERE NCLI IN(SELECT NCLI FROM CLIENT WHERE LOCALITE LIKE 'Toulouse'))) AND LIBELLE LIKE '%SAPIN%'
    C. Qui n'ont été commandés qu'à Toulouse

    là je sèche...je sais qu'il va y avoir probablement un distinct en plus par rapport à au-dessus mais je ne vois pas trop

    j'avais pensé à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT LIBELLE FROM PRODUIT where NPRO in(SELECT NPRO FROM DETAIL where NCOM in (SELECT NCOM FROM COMMANDE WHERE NCLI not in (SELECT NCLI FROM CLIENT WHERE LOCALITE not like 'Toulouse'))) AND LIBELLE like '%SAPIN%'
    mais ça me donne la même chose qu'au-dessus ce qui est logique en fait vu que c'est la contraposée ( -_- )


    Si vous pouviez m'éclaircir...un grand 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 : 53 143
    Points
    53 143
    Billets dans le blog
    6
    Par défaut
    c)
    ...
    AND NOT EXISTS( ... acheter ailleurs qu'à toulouse ... )

    A +

  3. #3
    Membre éclairé Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Points : 770
    Points
    770
    Par défaut
    j'ai peur de ne pas bien comprendre la clause NOT EXISTS...Même en lisant la doc.

    EN effet,

    Imaginons maintenant que je veuille:

    4.26 Rechercher les clients qui ont commandé le produit 'PA60' ou le produit 'PA45' mais pas les
    deux.


    je fais donc:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT CLIENT.NCLI,NOM 
    FROM CLIENT,PRODUIT 
    WHERE PRODUIT.NPRO in 
                  (SELECT NPRO FROM PRODUIT WHERE NPRO='PA60')
                  AND NOT EXISTS(SELECT NPRO FROM PRODUIT WHERE NPRO='PA45')
    mais ca ne me donne pas le résultat escompté, ca me dit: aucune donnée, alors que ça devrais m'en afficher 2

  4. #4
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Tu fais d'abord une jointure entre toutes tes tables, ce qui te permet de faire le lien entre le produit et le lieu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM Client, Commande, Detail Produit
    WHERE [toutes tes conditions qui lient tes PK avec les FK]
      AND produit = 'xxxxx'
      AND lieu = 'llllll'
    Maintenant, si tu ne veux pas qu'il ait été acheté ailleurs, tu as besoin du not exits

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT *
    FROM Client a, Commande b, Detail c,  Produit d
    WHERE [toutes tes conditions qui lient tes PK avec les FK]
      AND produit = 'xxxxx'
      AND lieu = 'llllll'
      AND NOT exists 
    (SELECT *
    FROM Client e, Commande f, Detail g,  Produit h
    WHERE [toutes tes conditions qui lient tes PK avec les FK]
      AND produit = 'xxxxx'
      AND lieu <> 'llllll')

  5. #5
    Membre éclairé Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Points : 770
    Points
    770
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT *
    FROM Client a, Commande b, Detail c, Produit d
    WHERE a.NCLI=b.NCLI AND c.NPRO=d.NPRO AND c.NCOM=b.NCOM
    AND a.LOCAlITE = 'Toulouse'
    AND NOT exists
    (SELECT *
    FROM Client e, Commande f, Detail g, Produit h
    WHERE a.NCLI=b.NCLI AND c.NPRO=d.NPRO AND c.NCOM=b.NCOM
    AND a.LOCALITE <> 'Toulouse')
    AND
    LIBELLE like '%SAPIN%'
    admettons que je fasse ceci pour afficher:

    le numéro et le libellé des produits en sapin qui n'ont été commandés QU'à toulouse.



    j'obtiens 2 résultats de trop, j'obtiens un produit en sapin qui a été commandé a toulouse et à lille 2 fois et un correct.



  6. #6
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    et en faisant la jointure dans la sous-requête entre e, f, g et h au lieu de a, b, c, et d ?

  7. #7
    Membre éclairé Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Points : 770
    Points
    770
    Par défaut
    Même résultat,

    En fait j'obtiens un de trop qui a été commandé à Lille aussi.

    Je vais me repencher sur le problème et repartir du départ, j'ai du oublier quelque chose


    merci en tout cas pour ton aide

  8. #8
    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 : 53 143
    Points
    53 143
    Billets dans le blog
    6
    Par défaut
    Vous aurez du mal à vous en sortir en faisant vos joi_ntures dans le where. Vous avez repris les m^mes alias dans la sous requête que dans la requête externe !

    -- quelque chose comme :
    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
    SELECT *
    FROM   Client a
           INNER JOIN Commande b
                 ON a.NCLI = b.NCLI
           INNER JOIN Detail c
                 ON c.NCOM = b.NCOM
           INNER JOIN Produit d
                 ON c.NPRO=d.NPRO
    WHERE  LOCALITE = 'Toulouse'
    AND    LIBELLE LIKE '%SAPIN%'
    AND NOT EXISTS (SELECT *
                    FROM   Client e
                           INNER JOIN CommandeCommande f
                                 ON e.NCLI = f.NCLI
                           INNER JOIN Detail g
                                 ON f.NCOM = g.NCOM 
                           INNER JOIN Produit h
                                 ON g.PRO = d.NPRO
                    WHERE c.NPRO <> h.NPRO 
                      AND e.LOCALITE = 'Toulouse')
    A +

Discussions similaires

  1. [Oracle 10g] Problème Union-sous requêtes-group by
    Par slobberbone dans le forum SQL
    Réponses: 2
    Dernier message: 17/09/2007, 18h16
  2. [Oracle 8]Group by d'Oracle !!
    Par Wormus dans le forum Oracle
    Réponses: 13
    Dernier message: 10/02/2006, 10h03
  3. [SQL Oracle] Requête complexe
    Par lapartdombre dans le forum Langage SQL
    Réponses: 1
    Dernier message: 02/11/2005, 14h31
  4. [Oracle] Requête avec colonne optionnelle
    Par Original Prankster dans le forum Langage SQL
    Réponses: 6
    Dernier message: 30/08/2005, 09h24
  5. Aide sur une requête (Group By...??)
    Par Cocolapin dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/12/2004, 10h26

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