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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    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
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    c)
    ...
    AND NOT EXISTS( ... acheter ailleurs qu'à toulouse ... )

    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
    Membre émérite Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    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 Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    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 émérite Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    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 Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    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 ?

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