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

Développement SQL Server Discussion :

Problème sur une requète [2012]


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2013
    Messages : 15
    Par défaut Problème sur une requète
    Bonjour,

    J'aurais une petite question qui me laisse sans réponse.

    J'ai une première requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT vue4.fullname, COUNT(*) AS NB_rdv FROM vue1  
     
    	inner join vue2   on ( vue2.id = vue1.idvue2)
    	inner join vue3  on ( vue3.id = vue1.idvue3 )
     
    	inner join vue4  on ( vue4.id = vue1.idvue4)
    	and vue4.champs ='2FE7DDFE-10EE-E211-9839-00505681002E'
    	GROUP BY vue4.fullname
    Qui me ramène un jeu de donnée correcte .
    Je veux ensuite l'inverse ( c'est à dire les entrées de vue1 pas présent sur la vue2)

    Je fais cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT vue4.fullname, COUNT(*) AS NB_rdv FROM vue1  
     
    	left join vue2   on ( vue2.id = vue1.idvue2)
    	inner join vue3  on ( vue3.id = vue1.idvue3 )
     
    	inner join vue4  on (vue4.id = vue1.idvue4)
    	and vue4.champs ='2FE7DDFE-10EE-E211-9839-00505681002E'
    	GROUP BY vue4.fullname
    Mais je n'ai pas le bon retour et suis obligé de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE vue1.id NOT IN vue2
    Pourquoi ?

  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
    Une requête plus correcte aurait été :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT vue4.fullname, COUNT(*) AS NB_rdv 
    FROM   vue1  
           INNER JOIN vue2   
                 ON vue2.id = vue1.idvue2
           INNER JOIN vue3  
                 ON vue3.id = vue1.idvue3
           INNER JOIN vue4  
                 ON vue4.id = vue1.idvue4
    WHERE  vue4.champs ='2FE7DDFE-10EE-E211-9839-00505681002E'
    GROUP  BY vue4.fullname
    1) le distinct ne sert à rien puisque vous avez un groupage
    2) distinguez le filtre de la jointure

    Enfin ce que vous voulez faire est une semi anti-jointure externe....
    Pour cela il faut un critère de suppression.
    En effet la jointure externe "ajoute" les lignes jointes aux lignes non jointes. Il vous faut donc retirer les lignes jointes pour ne conserver que les non jointes... Ce qui peut se traduire par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT vue4.fullname, COUNT(*) AS NB_rdv 
    FROM   vue1  
           LEFT OUTER JOIN vue2   
                 ON vue2.id = vue1.idvue2
           INNER JOIN vue3  
                 ON vue3.id = vue1.idvue3
           INNER JOIN vue4  
                 ON vue4.id = vue1.idvue4
    WHERE  vue4.champs ='2FE7DDFE-10EE-E211-9839-00505681002E'
      AND  vue2.id IS NULL
    GROUP  BY vue4.fullname
    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
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2013
    Messages : 15
    Par défaut
    Merci bien

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

Discussions similaires

  1. problème sur une requête imbriquée
    Par pbatty1 dans le forum Requêtes
    Réponses: 12
    Dernier message: 26/10/2007, 17h21
  2. problème sur une requête mysql
    Par atomikado dans le forum Requêtes
    Réponses: 4
    Dernier message: 05/10/2007, 16h04
  3. [Optimisation] Problème sur une requête UNION.
    Par françois62 dans le forum Requêtes
    Réponses: 5
    Dernier message: 28/06/2005, 16h08
  4. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45
  5. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17

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