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 18/06/2011, 21h05   #1
Invité de passage
 
Femme
Développeur informatique
Inscription : mai 2011
Messages : 27
Détails du profil
Informations personnelles :
Sexe : Femme

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mai 2011
Messages : 27
Points : 1
Points : 1
Par défaut Problème requête sqlserver

Bonsoir ,

J'ai une requête dont je veux utiliser deux tables une table FicheEngin et une table FichePneu

Je veux afficher, selon la référence du pneu , la date (à partir de FicheEngin) et l'opération réalisée ( à partir de FichePneu) sur ce pneu en cette date.
Sachant que la référence du pneu dans la fiche engin est trouvée dans l'une des positions des pneus dans l'engin c-à-d , elle peut être soit en AG , AD , ARDE , ARDI ....

J'ai abordé cette syntaxe qui ne fonctionne pas malheureusement :

Code :
 SELECT FE.Date , FP.ReferencePneu , FP.Operation FROM FicheEngin FE INNER JOIN FichePneu FP WHERE FP.ReferencePneu = FE.AG OR FE.AD OR FE.ARDE OR FE.ARDI OR FE.DEUXID OR FE.DEUXED OR FE.DEUXIG OR FE.DEUXEG OR FE.ARGE OR FE.ARGE ;

??? Solution ! Je travaille sous l'environnement C# ! Merci d'avance
ayouta.gfs est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 18/06/2011, 23h53   #2
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 520
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 520
Points : 3 967
Points : 3 967
Révisez votre SQL : http://sqlpro.developpez.com/cours/sqlaz/jointures/



Un indice en bas de votre écran : join ... on ...
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 11h05   #3
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
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 669
Points : 8 729
Points : 8 729
Bonjour,

En effet il aurait fallu écrire la jointure comme suit :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT		FE.Date 
		, FP.ReferencePneu 
		, FP.Operation 
FROM		dbo.FicheEngin AS FE
INNER JOIN	dbo.FichePneu AS FP
			ON FP.ReferencePneu = FE.AG
			OR FP.ReferencePneu = FE.AD
			OR FP.ReferencePneu = FE.ARDE
			OR FP.ReferencePneu = FE.ARDI
			OR FP.ReferencePneu = FE.DEUXID
			OR FP.ReferencePneu = FE.DEUXED
			OR FP.ReferencePneu = FE.DEUXIG
			OR FP.ReferencePneu = FE.DEUXEG
			OR FP.ReferencePneu = FE.ARGE
Cela dit avec un prédicat de jointure aussi long et basé uniquement sur des OR, je doute qu'avec un certain nombre de lignes dans les deux tables, cela soit performant

En fait, c'est votre modèle de données qui est faux : pour le moment vous avez une table FicheEngin avec autant de colonnes que de possibilités de pneu par engin.
Que se passera-t-il le jour ou un nouvel engin, sera acheté par votre entreprise, et qu'on doive effectuer une opération sur un pneu dont la position n'existe pas jusqu'ici ?
Vous allez ajouter une colonne, et modifier tout le code de votre application pour prendre en compte cette nouvelle colonne.

En revanche, si vous avez une table qui stocke toutes les positions de pneu possibles, et dans votre table fiche enfin, toutes les colonnes de position de pneu une seule qui référence la clé primaire de la table des positions de pneu, et une colonne pour la référence du pneu, votre requête devient alors :

Code :
1
2
3
4
5
6
7
SELECT		FE.Date 
		, FP.ReferencePneu
		, FE.PositionPneu
		, FP.Operation 
FROM		dbo.FicheEngin AS FE
INNER JOIN	dbo.FichePneu AS FP
			ON FP.ReferencePneu = FE.ReferencePneu
Comme vous n'avez alors qu'à créer un index sur la colonne seule ReferencePneu, votre requête sera très rapide.
Comme votre table a donc moins de colonnes, les pages de cette table sont plus riches en information.

Si vous voulez ajouter une nouvelle position, aucun problème : il suffit de l'ajouter dans la table de position des pneus ... et c'est tout !

@++
__________________
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é
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h24.


 
 
 
 
Partenaires

Hébergement Web