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 :

left outer join avec where


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Janvier 2014
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Janvier 2014
    Messages : 11
    Par défaut left outer join avec where
    Bonjour,

    Ci-dessous les deux tables etudiant et inscription.

    Je souhaite avoir la liste de ( no_etudiant, nom et prenom) et aussi nombre d’inscription des étudiants âgés de 15 ans et qui ont fait leur inscription au mois de janvier par exemple.
    Ma liste doit aussi avoir les étudiants qui n’ont fait aucune inscription et qui respectent les conditions :

    ETUDIANT
    No_etudiant
    Nom
    Prenom
    Date_naissance
    Inscription
    No_insc
    Date_insc
    No-etudiant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select membre.No_etudiant,Nom,prenom,count(no_insc)
    from etudiant,inscription
    left outer join etudiant on etudiant.no_etudiant= inscription.no_etudiant
    where datediff(year,date_nais,getdate())='15'
     and  datepart(month,date_location)= '01'
     group by etudiant.No_etudiant,Nom,prenom
    Pourriez vous m'aider car quand j'exécute il me donne cette erreur :

    Msg 1013, Level 16, State 1, Line 2
    The objects "etudiant" and "etudiant" in the FROM clause have the same exposed names. Use correlation names to distinguish them

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 36
    Par défaut
    Bonjour,

    La requête suivante renvoie la liste des étudiants (no_etudiant, nom, prenom, nb_insc) de 15 ans qui se sont inscrits en janvier 2014 ou qui ne se sont pas encore inscrits :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT etudiant.No_etudiant, etudiant.Nom, etudiant.prenom, COUNT(no_insc) AS nbinsc
    FROM etudiant 
    LEFT OUTER JOIN inscription ON etudiant.no_etudiant = inscription.no_etudiant
    WHERE DATEDIFF(YEAR,etudiant.date_nais,GETDATE()) = 15
    AND (etudiant.No_etudiant IN (SELECT No_etudiant FROM Inscription WHERE DATEPART(MONTH,Date_insc) = 1 AND DATEPART(YEAR,Date_insc) = 2014) 
    OR etudiant.No_etudiant NOT IN (SELECT No_etudiant FROM Inscription)) 
    GROUP BY etudiant.No_etudiant, etudiant.Nom, etudiant.prenom

  3. #3
    Membre habitué
    Inscrit en
    Janvier 2014
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Janvier 2014
    Messages : 11
    Par défaut
    Salut,

    Ca me donne la meme erreur
    The objects "inscription" and " inscription" in the FROM clause have the same exposed names. Use correlation names to distinguish them.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 002
    Billets dans le blog
    6
    Par défaut
    Vous devez rajouter des alias à vos tables et les utilisez pour corrélation.

    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/ * * * * *

  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,

    Une requête équivalente serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT		E.No_etudiant
    		, E.Nom
    		, E.prenom
    		, COUNT(no_insc) AS nbinsc
    FROM		dbo.etudiant AS E
    LEFT JOIN	dbo.inscription AS I
    			ON E.no_etudiant = I.no_etudiant
    WHERE		E.date_nais > DATEADD(year, -16, GETDATE())
    AND		E.date_nais <= DATEADD(year, -15, GETDATE())
    AND		I.Date_insc BETWEEN '20140101' AND '20140201' -- Ces deux dates sont à minuit, inclus
    GROUP BY	E.No_etudiant, E.Nom, E.prenom
    La différence ici, c'est que comme les prédicats sont cherchable, on fera de la recherche dans un index sur les colonnes de type date, et non pas un balayage complet.
    En effet, il est plus simple de chercher des valeurs dans une plage, que d'appliquer d'abord une fonction sur une colonne, et d'en comparer ensuite les valeurs (typiquement le cas du DATEDIFF dans votre requête).

    @++

  6. #6
    Membre habitué
    Inscrit en
    Janvier 2014
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Janvier 2014
    Messages : 11
    Par défaut
    Salut,
    je n'arrive pas a exécuter par contre
    j'ai rajouté ça sur ma requête pour faire les alias

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select etudiant.No_etudiant,Nom,prenom,count(no_insc)
    from etudiant as t1
    left outer join inscription as t2  on t1.no_etudiant= t2.no_etudiant
    WHERE DATEDIFF(YEAR,date_nais,GETDATE()) = '15'
    AND (t1.No_etudiant IN (SELECT No_etudiant FROM inscription WHERE DATEPART(MONTH,Date_location) = '01')
    OR t1.No_etudiant NOT IN (SELECT No_etudiant FROM inscription)) 
    GROUP BY t1.No_etudiant, Nom, prenom
    mais aussi je réussi pas a exécuter

  7. #7
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Bonjour,

    Une requête équivalente serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT		E.No_etudiant
    		, E.Nom
    		, E.prenom
    		, COUNT(no_insc) AS nbinsc
    FROM		dbo.etudiant AS E
    LEFT JOIN	dbo.inscription AS I
    			ON E.no_etudiant = I.no_etudiant
    WHERE		E.date_nais > DATEADD(year, -16, GETDATE())
    AND		E.date_nais <= DATEADD(year, -15, GETDATE())
    AND		I.Date_insc BETWEEN '20140101' AND '20140201' -- Ces deux dates sont à minuit, inclus
    GROUP BY	E.No_etudiant, E.Nom, E.prenom
    La différence ici, c'est que comme les prédicats sont cherchable, on fera de la recherche dans un index sur les colonnes de type date, et non pas un balayage complet.
    En effet, il est plus simple de chercher des valeurs dans une plage, que d'appliquer d'abord une fonction sur une colonne, et d'en comparer ensuite les valeurs (typiquement le cas du DATEDIFF dans votre requête).

    @++
    Il faudrait mettre la condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    I.Date_insc BETWEEN '20140101' AND '20140201' -- Ces deux dates sont à minuit, inclus
    dans la jointure externe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT		E.No_etudiant
    		, E.Nom
    		, E.prenom
    		, COUNT(no_insc) AS nbinsc
    FROM		dbo.etudiant AS E
    LEFT JOIN	dbo.inscription AS I
    			ON E.no_etudiant = I.no_etudiant
                          AND I.Date_insc BETWEEN '20140101' AND '20140201' -- Ces deux dates sont à minuit, inclus
    WHERE		E.date_nais > DATEADD(year, -16, GETDATE())
    AND		E.date_nais <= DATEADD(year, -15, GETDATE())
    GROUP BY	E.No_etudiant, E.Nom, E.prenom

Discussions similaires

  1. Réponses: 9
    Dernier message: 16/10/2009, 10h07
  2. LEFT OUTER JOIN avec trois tables
    Par Space Cowboy dans le forum Requêtes
    Réponses: 8
    Dernier message: 19/08/2008, 14h51
  3. Problème de left outer join avec Ibatis
    Par sarsipius dans le forum JDBC
    Réponses: 1
    Dernier message: 28/02/2008, 14h51
  4. left outer join avec condition
    Par fisto dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 14/08/2007, 08h52
  5. Réponses: 6
    Dernier message: 06/10/2006, 23h15

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