Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/01/2011, 11h52   #1
Membre régulier
 
Julien Ricardo
Inscription : juillet 2010
Messages : 248
Détails du profil
Informations personnelles :
Nom : Julien Ricardo
Âge : 23

Informations forums :
Inscription : juillet 2010
Messages : 248
Points : 84
Points : 84
Envoyer un message via MSN à Juju54350
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 :
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.
Juju54350 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 12h04   #2
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 138
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 138
Points : 2 466
Points : 2 466
Envoyer un message via Yahoo à zinzineti
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 ? .... ?
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 12h27   #3
Membre régulier
 
Julien Ricardo
Inscription : juillet 2010
Messages : 248
Détails du profil
Informations personnelles :
Nom : Julien Ricardo
Âge : 23

Informations forums :
Inscription : juillet 2010
Messages : 248
Points : 84
Points : 84
Envoyer un message via MSN à Juju54350
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 ?
Juju54350 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 14h27   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 14h44   #5
Membre régulier
 
Julien Ricardo
Inscription : juillet 2010
Messages : 248
Détails du profil
Informations personnelles :
Nom : Julien Ricardo
Âge : 23

Informations forums :
Inscription : juillet 2010
Messages : 248
Points : 84
Points : 84
Envoyer un message via MSN à Juju54350
Je vais plutôt te montrer mon code C# où j'utilise la requête :

Code :
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.
Juju54350 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 20h24   #6
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 665
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 665
Points : 8 710
Points : 8 710
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 :
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

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 11h52   #7
Membre régulier
 
Julien Ricardo
Inscription : juillet 2010
Messages : 248
Détails du profil
Informations personnelles :
Nom : Julien Ricardo
Âge : 23

Informations forums :
Inscription : juillet 2010
Messages : 248
Points : 84
Points : 84
Envoyer un message via MSN à Juju54350
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 ?
Juju54350 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2011, 15h58   #8
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 665
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 665
Points : 8 710
Points : 8 710
Bonjour,

Citation:
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

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h01.


 
 
 
 
Partenaires

Hébergement Web