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 :

Requête avec EXISTS


Sujet :

Langage SQL

  1. #1
    Membre actif Avatar de DeWaRs
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 291
    Points : 269
    Points
    269
    Par défaut Requête avec EXISTS
    Bonjour a tous,

    Je développe un projet sous VB.NET qui se connecte à une base hébergé sous SQL Serveur 2008.

    Je n'arrive pas a créer une requête qui m'afficherais la liste des buildings ou il y a du matériel de créer.
    Afin d'être plus claire, voici un extrait de ma BDD :

    tblCountry
    -IdCountry
    -CountryName

    tblBuilding
    -IdBuilding
    -IdCountry
    -BuildingName

    tblTeam
    -IdTeam
    -IdBuilding
    -TeamName

    tblMaterial
    -IdMaterial
    -IdTeam
    -MaterialName

    Ce que je voudrais, c'est d'afficher uniquement les buildings ou il y a du materiel de créer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM tblBuilding WHERE EXISTS ( ... )
    Quelqu'un pourrait-il m'aider ?

    Cordialement.

    DeWaRs

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    D'après les tables, tu as le MCD suivant :
    country -0,n----situer----1,1- building -0,n----héberger----1,1- team -0,n----posséder----1,1- material

    Il suffit de faire une jointure pour accéder au matériel à partir du building.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT b.BuildingName
    FROM tblBuilding b
    WHERE EXISTS
    (
    	SELECT 1
    	FROM tblMaterial m
    	INNER JOIN tblTeam t ON t.IdTeam = m.IdTeam
    	WHERE t.IdBuilding = b.IdBuilding
    )
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre actif Avatar de DeWaRs
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 291
    Points : 269
    Points
    269
    Par défaut
    Effectivement, cela fonctionne. J'était partie sur une double clause "EXISTS"...

    Merci de ton aide.

    DeWaRs

  4. #4
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Pourquoi faire un "exists" là où un distinct suffirait ?

    Je pense que le distinct sera plus rapide, dans la mesure où on n'aura à faire qu'une bête jointure.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT distinct b.BuildingName
    FROM tblBuilding b
    inner join tblTeam on t.IdBuilding = b.IdBuilding
    inner join tblMaterial m on m.IdTeam = t.IdTeam
    On ne jouit bien que de ce qu’on partage.

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Je pense que le distinct sera plus rapide, dans la mesure où on n'aura à faire qu'une bête jointure.
    Ça ce n'est pas sûr du tout !
    Voir le point 9 de ce tableau d'optimisations fourni par SQLPro.

    L'explication que je suppose est que la jointure va opérer sur toute la table alors que EXISTS s'arrête dès que la condition est satisfaite.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Vu que la requête ne porte que sur les index de clés étrangères (donc on ne lit pas les données de la table), j'ai quand même des réserves.

    A tester...

    -- Après test, effectivement, la solution du "not exists" est à peine plus rapide.
    On ne jouit bien que de ce qu’on partage.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2000] Requête avec EXISTS
    Par B-CAB dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 02/07/2010, 11h05
  2. Optimisation de requêtes avec EXISTS
    Par Asfaloth dans le forum Requêtes
    Réponses: 1
    Dernier message: 19/06/2010, 08h16
  3. sql requête avec NOT EXISTS
    Par wang_xue dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/10/2007, 19h48
  4. Requête avec NOT EXISTS
    Par lodan dans le forum Requêtes
    Réponses: 2
    Dernier message: 12/07/2007, 10h16
  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