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

SQL Oracle Discussion :

Requete qui n'ont JAMAIS


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 36
    Points : 12
    Points
    12
    Par défaut Requete qui n'ont JAMAIS
    Bonsoir à tous !

    Voici mon problème, je n'arrive pas à faire une requête que je pense sera simple pour vous :p

    voici mes trois tables que j'ai créées avec :

    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
     
    CREATE TABLE  ecoles 
       (	ecole_id 	NUMBER(10) PRIMARY KEY, 
    	nom 		VARCHAR2(20), 
    	type 		VARCHAR2(20), 
    	adresse 	VARCHAR2(100), 
    	ville 		VARCHAR2(50)
       )
     
    CREATE TABLE  boites
       (	boite_id 	NUMBER(10) PRIMARY KEY, 
    	nom 		VARCHAR2(20), 
    	adresse 	VARCHAR2(100),  
    	ville 		VARCHAR2(50), 
            capacitee 	NUMBER(4),
            prix_entree 	NUMBER(3),
            prix_conso 	NUMBER(3),
            prix_bouteille	NUMBER(3)
       )
    CREATE table soirees 
    (    
    	soiree_id   	NUMBER(10) PRIMARY KEY,
        	boite   	NUMBER(10) CONSTRAINT sboite_fk REFERENCES BASES.boites (boite_id)
       	ecole		NUMBER(10) CONSTRAINT secole_fk REFERENCES BASES.ecoles (ecole_id)
       	nb_etudiant	NUMBER(4),      
        	titre		VARCHAR2(20),
        	dates		DATE,
        	heure       	NUMBER(4)
    )
    Il me faut la requête permettant d'afficher les écoles qui ont déjà fait une soirée dans la boite nommée VIP, mais qui n'en n'ont jamais fait dans celle nommée 'brasil'

  2. #2
    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
    Qu'avez-vous commencé à écrire ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 36
    Points : 12
    Points
    12
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select e.nom 
    from boites b, soirees s, ecoles e
    where b.boite_id = s.boite
    AND (s.ecole = e.ecole_id)
    AND (b.nom = 'VIP')
    AND (b.nom NOT LIKE (select b2.nom from boites b2 where (b2.nom = 'brasil')))
    Mais cette requête ne fonctionne pas bien.
    Elle me renvoie le nom d'une école même si cette dernière à déjà fait une soirée au brasil

  4. #4
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 101
    Points : 126
    Points
    126
    Par défaut
    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
     
    With ecoles As (Select 1 ECOLE_ID, 'école1' NOM From DUAL
    Union All Select 2 ECOLE_ID, 'école2' NOM From DUAL
    Union All Select 3 ECOLE_ID, 'école3' NOM From DUAL),
    boites As (Select 1 BOITE_ID, 'VIP' NOM From DUAL
    Union All Select 2 BOITE_ID, 'brasil' NOM From DUAL
    Union All Select 3 BOITE_ID, 'boite3' NOM From DUAL),
    soirees as (Select 1 SOIREE_ID, 1 BOITE, 1 ECOLE From DUAL
    Union All Select 2, 2, 1 From DUAL
    Union All Select 3, 3, 1 From DUAL
    Union All Select 4, 1, 2 From DUAL
    Union All Select 5, 2, 2 From DUAL
    Union All Select 6, 1, 3 From DUAL
    Union All Select 7, 3, 3 From DUAL)
    Select E.NOM
      From ECOLES E
     Where Exists (Select 1 From BOITES B
              Join SOIREES S On B.BOITE_ID = S.BOITE
             Where E.ECOLE_ID = S.ECOLE And B.NOM = 'VIP')
       And Not Exists (Select 1 From BOITES B
              Join SOIREES S On B.BOITE_ID = S.BOITE
             Where E.ECOLE_ID = S.ECOLE And B.NOM = 'brasil')

  5. #5
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Si tu veux faire des jointures, il vaut mieux travailler sur les clés primaires.

    Requête sans jointure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select nom from ecoles
    where ecole_id not in (select ecole from soirees  where boite in (select boite_id from boites where nom like 'brasil')
    and ecole_id in (select ecole from soirees  where boite  in (select boite_id from boites where nom like 'VIP')
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 36
    Points : 12
    Points
    12
    Par défaut
    Merci

  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
    Avec des jointures simples et un seul table scan :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      select e.nom 
        from ecoles e
             inner join soirees s
               on s.ecole = e.ecole_id
             inner join boites b
               on b.boite_id = s.boite
       where b.nom in ('VIP', 'brasil')
    group by e.nom
      having count(distinct b.nom) = 1
         and max(b.nom) = 'VIP';

Discussions similaires

  1. [AC-2007] Requete pour sortir les éléments qui n'ont pas une caractéristique donnée
    Par abdessmz dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 02/04/2014, 11h00
  2. A ceux qui n'ont pas migré vers VB.NET
    Par bidou dans le forum VB 6 et antérieur
    Réponses: 153
    Dernier message: 12/12/2013, 13h33
  3. [VB6] recuperer une requete qui renvoie du xml
    Par voyageur dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 15/12/2004, 10h03
  4. Requete qui ne s'occupe pas de la casse
    Par tripper.dim dans le forum SQL
    Réponses: 2
    Dernier message: 09/12/2004, 19h17
  5. la liste des clients qui n'ont pas acheter aucun article ...
    Par TéBeSsI dans le forum Langage SQL
    Réponses: 6
    Dernier message: 13/02/2004, 14h57

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