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 utilisant plusieurs tables


Sujet :

MS SQL Server

  1. #1
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Juillet 2010
    Messages : 292
    Points : 134
    Points
    134
    Par défaut Requête utilisant plusieurs tables
    Bonjour,


    Je sais que mon problème a l'air simple mais je voudrais avoir une confirmation.
    Je sais que INNER JOIN est plus recommandé que WHERE pour les jointures. Est-ce qu'une requête comme ceci est exacte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT [table1].[donnee1], [table1].[donnee2], [table2].[donnee1]
    FROM [table1]
    INNER JOIN [table2] ON [table1].[id] = [table2].[id]
    ORDER BY [table1].[donnee3]

    Merci d'avance de votre aide.

  2. #2
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Vu de loin oui. Mais tout dépend de la définition des tables et de ce que tu attend de cette requête. quelles sont le FK ? sont-elles indexées ? .... ?

  3. #3
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Juillet 2010
    Messages : 292
    Points : 134
    Points
    134
    Par défaut
    En fait, dans la requête de mon projet, j'utilise trois tables : la première table est liée avec la deuxième par un id et la première avec la troisième par un nom.

    Maintenant je ne sais pas si elles sont indexées. On peut voir ça où ? Dans le design ?

  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
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par Juju54350 Voir le message
    Maintenant je ne sais pas si elles sont indexées. On peut voir ça où ? Dans le design ?
    Dans management Studio, clique droit sur les tables puis
    script table as > Create to > ...

    poste les scripts générés, comme ca on aura aussi la structure complète des tables.

    Et au passage, une jointure sur un nom (varchar ?) n'est pas une bonne idée...

  5. #5
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Juillet 2010
    Messages : 292
    Points : 134
    Points
    134
    Par défaut
    Je vais plutôt te montrer mon code C# où j'utilise la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SqlDataSource sds = new SqlDataSource(Connection.ConnectionString, "SELECT [MyPanel-ContactLog].[surveyname], Description, contactdatetime, [MyPanel-ContactLog].[gain] " +
    "FROM [MyPanel-ContactLog] " +
    "INNER JOIN [Surveys] ON [MyPanel-ContactLog].[surveyname] = [Surveys].[SurveyName] " +
    "WHERE ([MyPanel-ContactLog].[surveyname] NOT IN (SELECT projectname " +
                                                                             "FROM [MyPanel-Payements] " +
                                                                             "WHERE (panelguid = @panelguid))) " +
                                                                             "AND ([MyPanel-ContactLog].panelGuid = @panelguid)");

    La requête comme ça fonctionne mais si je rajoute un INNER JOIN et une propriété de la table MyPanel-Payements, ça ne m'affiche plus rien.

  6. #6
    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 : 43
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Si vous avez remplacé le WHERE de votre requête par un INNER JOIN, c'est normal que celle-ci ne vous retourne rien.
    Une jointure naturelle (INNER JOIN) vous retourne les valeurs des colonnes des deux tables pour lesquelles les valeurs des colonnes participant à la jointure existent dans les deux tables.

    Or ici, ce que vous cherchez, c'est les lignes de [MyPanel-ContactLog] pour lesquelles la colonne surveyname n'a pas les valeurs de la colonne projectname de la table [MyPanel-Payements].
    C'est donc une demi-jointure que vous devez spécifier : elle vous permet de retourner les lignes pour lesquelles les valeurs des colonnes qui participent à la jointure existent dans les deux tables, plus celles qui n'existent pas dans la table à droite (LEFT JOIN) ou à gauche (RIGHT JOIN) de la jointure.

    Vous pouvez donc réécrive votre requête comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT		L.surveyname
    		, Description
    		, contactdatetime
    		, L.gain
    FROM		dbo.[MyPanel-ContactLog] AS L
    INNER JOIN	Surveys AS S
    			ON L.surveyname = S.SurveyName
    LEFT JOIN	dbo.[MyPanel-Payements] AS P
    			ON P.projectname = L.surveyname
    			AND P.panelguid = @panelguid
    WHERE		L.panelGuid = @panelguid
    AND		P.projectname IS NULL
    Notez que les crochets sont inutiles si vos tables respectent les règles SQL de nommage des tables (pas de signes cabalistiques ni d'espaces), et que pour alléger votre code en terme de lisibilité, vous pouvez aliaser vos tables.

    N'oubliez pas de qualifier les noms des tables qui participent à votre requête par le nom du schéma auquel elles appartiennent.
    Cela évite à SQL Server de le chercher pour vous

    @++

  7. #7
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Juillet 2010
    Messages : 292
    Points : 134
    Points
    134
    Par défaut
    Je vais être honnête, ton code est intéressant mais j'ai pas tout compris.

    Pour les alias je connaissais mais pas les LEFT JOIN et les RIGHT JOIN et je ne comprends pas "les valeurs de la table de droite ou de gauche".

    Au final, je dois afficher en plus une donnée de la table MyPanel-Payements dans le SELECT. Est-ce que la jointure doit être changée ?

  8. #8
    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 : 43
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    mais pas les LEFT JOIN et les RIGHT JOIN et je ne comprends pas "les valeurs de la table de droite ou de gauche".
    Pour les demi-jointures, voyez ce petit billet, et pour un cors complet, voyez celui de SQLPro ici

    pour les "droite" et "gauche", il s'agit de la position du nom des tables par rapport au mot-clé JOIN.
    On dit que la table est à gauche de la jointure quand le nom de la table est avant le mot-clé JOIN, et qu'elle est à droite quand son nom est après le mot-clé JOIN

    @++

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

Discussions similaires

  1. Requéte sur plusieurs tables
    Par polux23 dans le forum Requêtes
    Réponses: 11
    Dernier message: 23/02/2006, 23h00
  2. [VB]Utiliser plusieurs table liées avec un contrôle Data
    Par yangoal25 dans le forum VB 6 et antérieur
    Réponses: 25
    Dernier message: 21/02/2006, 15h36
  3. [SQL] Une requête dans plusieurs tables
    Par Anduriel dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 23/12/2005, 16h23
  4. Requête sur plusieurs tables
    Par drinkmilk dans le forum Langage SQL
    Réponses: 8
    Dernier message: 11/07/2005, 12h25
  5. utiliser plusieurs table et qreport
    Par StephCal dans le forum Bases de données
    Réponses: 7
    Dernier message: 25/10/2004, 09h28

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