Requête de débutant...

Résolu
Signaler
Messages postés
7
Date d'inscription
mardi 2 novembre 2004
Statut
Membre
Dernière intervention
5 mai 2009
-
Messages postés
698
Date d'inscription
jeudi 16 janvier 2003
Statut
Membre
Dernière intervention
20 mai 2011
-
Bonjour,

Je viens d'installer SQL SERVEUR 2008 EXPRESS + sqlManagement studio et je bloque sur l'écriture de la première requête. J'ai créé un petite base qui dipose de 2 tables, 1 "fournisseurs" et une autre "produits". Dans la table produit il y a 2 colonnes "fournisseur_1" et "fournisseurs_2" + d'autre. Le nom du fournisseur se trouve dans la table "founisseur".

La requéte suivante me donne bien le nom des fournisseur_1
SELECT dbo.Fournisseurs.SocieteNom AS F_1, dbo.Produits.Reference
FROM dbo.Fournisseurs INNER JOIN
dbo.Produits ON dbo.Fournisseurs.FournisseurID = dbo.Produits.Fournisseur_1

Par contre je n'arrive pas écrire la requéte que me donnerai comme résultat 3 colonnes à savoir la ref le nom de fournisseur_1 et le nom du fournisseur_2 s'il existe.....


PAr avance merci de votre aide.

8 réponses

Messages postés
238
Date d'inscription
lundi 2 mars 2009
Statut
Membre
Dernière intervention
29 septembre 2011

Salut,
As tu adapté ma requête parce que telle quelle, c'est sûr qu'elle ne fonctionnera pas ?!

étant donné que tu es débutant, te serait-il possible de me fournir le schéma relationnel pour fournisseur et produit au moins? (ex : nom_table(champ1, champ2....)

Il est normal que tu retrouves l'id du fournisseur dans ta table produit, il s'agit de la clef primaire (grâce à une clef primaire tu détermines une et une seule occurence de la table) de la table fournisseur.

Pas besoin de trop te compliqué la vie, une requête suffit à ce que tu veux faire !

The possible meet the impossible to become the possimpible !!
Messages postés
698
Date d'inscription
jeudi 16 janvier 2003
Statut
Membre
Dernière intervention
20 mai 2011
2
Bonjour

Tout d'abord, il y a quelques problems au niveau conceptuel dans la structure de base : mettre deux champs poru les fournisseurs n'est pas une bonne idee, i leut fallu trois tables : Fournisseurs (IDFournisseur, Nom, Raisonsociale,...), une table produits (IDProduit, nom, description,...) et une table Fournisseurs_produit (IDFournisseur, IDProduit)

mais je pense que le but de votre base est plutot de "prendre en main" le SQL.

pour votre probleme, il doit pouvoir se resoudre comme ceci :
SELECT produit.Reference, F1.Nom, F2.Nom
FROM Produit
INNER JOIN Fournisseur F1 ON (Produit.Fournisseur_1 = F1.FournisseurID)
LEFT OUTER JOIN Fournisseur F2 ON (Produit.Fournisseur_2 = F2.FournisseurID)

Ca devrait faire l'affaire.
si le resultat n'est pas celui attendu, précisez le resultat obtenu, et celui désiré afin qu'on y voit plus clair.
Messages postés
698
Date d'inscription
jeudi 16 janvier 2003
Statut
Membre
Dernière intervention
20 mai 2011
2
re,

non, en fait tu peux utiliser les alias autant de fois que tu veux.
pour tes fournisseurs, si tu veux recuperer leur nom et leur adresse par exemple, tu pourra faire F1.nom, F1.adresse, F2.nom, F2.adresse.

en fait ce que je fais dans la requete, c'est que j'apelle DEUX FOIS la meme table, c'est pourquoi j'utilise des alias, pour différencier
Je fais d'abord une jointure de la table fournisseur sur le champs fournisseur_1 de la table Produit, pour avoir le nom du fournisseur précisé dans la colonne fournisseur_1 de chaque produit
Ensuite je fais une jointure sur la colonne fournisseur_2,...

pour ce qui est du LEFT OUTER JOIN, pour la deuxieme jointure, ca permet d'afficher quand meme les resultat de la premiere jointure, meme si il n'y a pas de correspondance pour la deuxieme jointure (en gros, c apermet d'afficher quand meme les produits qui n'ont pas de fournisseur2)

(en fait pour mieux comprendre la requete, tu pourrais considerer que les fournisseur dont l'ID est dans la colonne fournisseur1 de la table produit sont contenus dans une table qui s'apelle F1, et que les fournisseur contenus dans la colonne Fournisseur2 sont contenus dans une autre table qui s'apelle F2, sauf que dans ton cas, tous les fournisseurs sont contenus dans la meme table, que l'on apelle donc deux fois)
Messages postés
238
Date d'inscription
lundi 2 mars 2009
Statut
Membre
Dernière intervention
29 septembre 2011

Salut,
j'ai une petite question à te poser : est ce vraiment utile à ce moment de savoir si il y a un second fournisseur ?

Je veux dire tu peux faire :
SELECT dbo.Fournisseurs.SocieteNom1 AS F_1, dbo.Fournisseurs.SocieteNom2 AS F_2, dbo.Produits.Reference FROM
dbo.Fournisseurs INNER JOIN dbo.Produits ON
dbo.Fournisseurs.FournisseurID = dbo.Produits.Fournisseur_1

et par la suite vérifier si la colonne F_2 est vide ou pas,non?

The possible meet the impossible to become the possimpible !!
Messages postés
7
Date d'inscription
mardi 2 novembre 2004
Statut
Membre
Dernière intervention
5 mai 2009

Merci de ton aide,

La requete que tu me donne ne retourne pas le résultat. Je cherche à avoir un tableau qui me donne pour tous les produits la liste des fournisseurs, dans la colonne fournisseur_1 je veux le nom du fournisseur alors que dans la table produits je trouve l'ID du fournisseur, et la même chose dans la colonne fournisseur_2.

Je suis vraiment débutant en SQL (depuis hier) c'est ma première requête, peut-être est ce impossible ?

Vaut-il passer par une vue intermédiare dans laquelle on retrouverai la liste des fournisseurs2 ?

Peut-on dans une même requete pointer deux fois sur une même colonne d'une jointure ?
Messages postés
7
Date d'inscription
mardi 2 novembre 2004
Statut
Membre
Dernière intervention
5 mai 2009

Merci beaucoup à vous deux, si j'ai bien compris un alias de table (ici F1 et F2) ne peut être utilisé qu'une seule fois dans une requête ?

Il subsiste encore une part d'ombre dans ma tête, pour quoi un INNER JOIN à la place du LEFT OUTER JOIN ne donne pas le même résultat vu qu'a priori on travaille sur deux objets distincts F1 ET F2 ?

J'avance, j'avance je vois de la lumière....
Messages postés
7
Date d'inscription
mardi 2 novembre 2004
Statut
Membre
Dernière intervention
5 mai 2009

Bon, d'accord
mais alors, pourquoi la requete suivante est erronnée :
SELECT dbo.Produits.Reference, F1.SocieteNom as Fournissuer_principal, F1.SocieteNom AS Fournisseur_Autre
FROM dbo.Produits INNER JOIN
dbo.Fournisseurs AS F1
ON dbo.Produits.Fournisseur_1 = F1.FournisseurID LEFT OUTER JOIN
ON dbo.Produits.Fournisseur_2 = F1.FournisseurID

Je pense que c'est parce que j'utilise deux fois F1.SocieteNom dans le select n'est ce pas ?
Si c'est le cas, je me suis mal exprimé dans le post précédent, et je voulais dire que l'on ne peut pas utiliser deux fois la même "colonne" d'un alias dans une même requête.
Messages postés
698
Date d'inscription
jeudi 16 janvier 2003
Statut
Membre
Dernière intervention
20 mai 2011
2
La requete ne fonctionne pas car il manque le nom de table pour la deuxieme jointure.

pour ce qui est d'utiliser deux fois la meme colonne, rien ne t'en empeche, mais il n'y a aucun interet, car ca te retournera deux fois la meme chose !!!!!

Le probleme ici c'est que tu as pour UN produit, DEUX Id de fournisseurs rattachés. il faut donc que tu aille chercher une fois le nom du fournisseur 1, puis le fournisseur 2, il te faut donc deux jointures. tu pourrais recuperer simplement tes informations avec une seule jointure, mais le resultat serait sur deux ligne, et non une seule :
PRODUIT1;FOURNISSEUR1
PRODUIT1;FOURNISSEUR2