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

MS SQL Server Discussion :

Requête avec l'opérateur EXISTS


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 50
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  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
    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
    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 averti
    Inscrit en
    Janvier 2011
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 50
    Par défaut
    J'ai réussi avec un IN mais pour le transformer avec l'opérateur EXISTS je n'arrive pas :S :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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')

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Essayez ceci :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    )

  5. #5
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

    @++

Discussions similaires

  1. Requête avec vérification d'existence dans une autre table
    Par TigerCX dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/04/2011, 19h06
  2. [AC-2007] Requête avec variante NOT EXISTS?
    Par mirumoto dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 22/03/2010, 14h35
  3. Requête avec NOT EXISTS
    Par lodan dans le forum Requêtes
    Réponses: 2
    Dernier message: 12/07/2007, 10h16
  4. [VBA] Erreur sur une requête avec un opérateur
    Par elgringo2007 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 03/07/2006, 17h12
  5. Requète avec NOT EXISTS
    Par missllyss dans le forum SQL
    Réponses: 2
    Dernier message: 23/09/2003, 15h20

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