Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
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 22/01/2011, 23h02   #1
Futur Membre du Club
 
Inscription : janvier 2011
Messages : 45
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 45
Points : 15
Points : 15
Par défaut Requête avec l'opérateur EXISTS

Bonjour,

Je dois réaliser une requête avec l'opérateur EXISTS cependant j'ai un problème étant donné qu'il faut réaliser 2 jointures sur 3 tables. Voici les tables:
Code :
1
2
3
4
 
PERSONNE(Nom, Ville, Emploi)
MAISON(Codem, Type, Adresse, Villeh, LoyerM)
LOUER(Codem, Nom, NombMois)
Sachant que Type peut prendre comme valeurs : T1, T2, T3, T4, STUDIO
comment trouver les personnes ayant loué des maisons de type T1 et T3 càd ayant loué une maison de type T1 et aussi une maison de type T3.
L'énoncé exige une utilisation de EXISTS.

Merci beaucoup
Aiglon13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2011, 12h11   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 950
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 950
Points : 17 769
Points : 17 769
Il faut faire une correlation entre la requête interne et la requête externe.

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2011, 13h13   #3
Futur Membre du Club
 
Inscription : janvier 2011
Messages : 45
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 45
Points : 15
Points : 15
J'ai réussi avec un IN mais pour le transformer avec l'opérateur EXISTS je n'arrive pas :S :

Code :
1
2
3
4
5
6
SELECT PERSONNE.Nom
FROM PERSONNE, MAISON, LOUER
WHERE PERSONNE.Nom = LOUER.Nom AND LOUER.Codem = MAISON.Codem AND Type = 'T1' AND PERSONNE.Nom IN 
															(SELECT PERSONNE.Nom
															FROM PERSONNE, MAISON, LOUER
															WHERE PERSONNE.Nom = LOUER.Nom AND LOUER.Codem = MAISON.Codem AND Type = 'T3')
Aiglon13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 16h39   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

Essayez ceci :

Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
SELECT PERSONNE.Nom
FROM PERSONNE P1
INNER JOIN LOUER ON P1.Nom = LOUER.Nom
INNER JOIN MAISON ON  MAISON.codem =  LOUER.codem
WHERE Type = 'T3'
AND EXISTS(
	SELECT NULL
	FROM PERSONNE P2
	INNER JOIN LOUER ON P2.Nom = LOUER.Nom
	INNER JOIN MAISON ON  MAISON.codem =  LOUER.codem
	WHERE Type = 'T1'
	AND P2.Nom = P1.Nom
)
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 02h11   #5
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 665
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 665
Points : 8 710
Points : 8 710
Bonjour,

L'opérateur EXISTS étant optimisé pour l'utilisation d'étoile, il vaut mieux l'utiliser.
Mais vous pouvez aussi réécrire la requête en utilisant une simple jointure :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT        P1.Nom
FROM        dbo.PERSONNE AS P1
INNER JOIN    dbo.LOUER AS L1
            ON P1.Nom = L.Nom
INNER JOIN    dbo.MAISON AS M1
            ON  M1.codem =  L.codem
INNER JOIN    dbo.PERSONNE AS P2
            ON P1.Nom = P2.Nom
INNER JOIN    dbo.LOUER AS L2 
            ON P2.Nom = L2.Nom
INNER JOIN    dbo.MAISON AS M2
            ON  M2.codem =  L2.codem
WHERE        M1.Type = 'T3'
AND        M2.Type = 'T1'
En outre le fait d'effectuer des jointures sur des valeurs dont le type n'est pas entier n'est pas du meilleur effet en termes de performance, même si je suppose que vous faites cela dans le cadre d'un exercice.

N'oubliez pas de qualifier le nom des objets que vous utilisez par le nom du schéma auquel ils appartiennent.
Par défaut c'est dbo

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket 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 02h43.


 
 
 
 
Partenaires

Hébergement Web