Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/11/2010, 02h16   #1
Invité de passage
 
Inscription : avril 2009
Messages : 36
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 36
Points : 2
Points : 2
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 :
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'
baobab95 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 02h36   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 680
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 680
Points : 10 473
Points : 10 473
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Qu'avez-vous commencé à écrire ?
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 02h57   #3
Invité de passage
 
Inscription : avril 2009
Messages : 36
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 36
Points : 2
Points : 2
Code :
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
baobab95 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 10h02   #4
Membre régulier
 
Inscription : septembre 2008
Messages : 83
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 83
Points : 87
Points : 87
Code :
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')
spdev666 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 10h55   #5
Membre Expert
 
Inscription : août 2002
Messages : 1 009
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : août 2002
Messages : 1 009
Points : 1 292
Points : 1 292
Si tu veux faire des jointures, il vaut mieux travailler sur les clés primaires.

Requête sans jointure
Code :
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
Windows XP/Vista
Linkin est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 10h57   #6
Invité de passage
 
Inscription : avril 2009
Messages : 36
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 36
Points : 2
Points : 2
Merci
baobab95 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 11h35   #7
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 680
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 680
Points : 10 473
Points : 10 473
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Avec des jointures simples et un seul table scan :
Code :
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';
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h44.


 
 
 
 
Partenaires

Hébergement Web