problème requête SQL

huître59
Invité n'ayant pas de compte PHPfrance

18 sept. 2011, 16:00

bonjour j'ai le modèle relationnel suivant

et j'ai des requêtes à faire
catégorie(N_cat,nom,description)
client(N_Cl,société,contact,fonction,ville,pays)
commande(N_co,N_Cl*,N_emp*,Date_C,date_liv,date_E,ville_liv)
detailcommande(N_co*,N_pr*,quantité,remise)
employeur(n_emp,Nom,prenom,Dn,pays)
fournisseur(N_fou,societe,contact,fonction,ville,pays,type)
produit(N_pr,nom,N_fou*,N_cat*,prix,stock)

je dois donner le nom des clients qui ont commandé des produits provenant d’un pays étranger, ainsi que leur pays, les produits commandés et les pays de provenance de ces produits et je dois que je n'y arrive pas

voilà ce que j'ai fait
select Client.nom,client.pays,produit.N_pr,fournisseur.pays
from client Cl,commande C,detailcommande DC,fournisseur F,produit P
where Cl.N_cl=C.N_cl
and C.N_com=DC.N_com
and F.N_fou=P.N_fou
and DC.N_pr=P.N_pr
and client.pays not in (select pays from fournisseur);
j'ai essayé ça mais ça ne marche pas

voila merci d'avance

Mammouth du PHP | 19672 Messages

18 sept. 2011, 17:59

Non seulement ça ne marche pas mais tu as peut-être même un message d'erreur :

Tu définis des alias pour les tables, mais tu en utilises d'autres pour indiquer les colonnes que tu veux récupérer, et avec en plus des variantes dans la casse (Client // client) Donc il faudrait corriger comme suit :
SELECT
  Cl.nom,
  Cl.pays,
  P.N_pr,
  F.pays
FROM client Cl,
     commande C,
     detailcommande DC,
     fournisseur F,
     produit P
WHERE Cl.N_cl = C.N_cl
  AND C.N_com = DC.N_com
  AND F.N_fou = P.N_fou
  AND DC.N_pr = P.N_pr
  AND Cl.pays NOT IN (
    SELECT pays FROM fournisseur
);
Et je suggère quand même d'apprendre à faire des jointures normalisées : la même requête normalisée donnerait ceci, avec une petite optimisation au passage :
SELECT
  Cl.nom,
  Cl.pays,
  P.N_pr,
  F.pays
FROM client Cl
  INNER JOIN commande        C ON Cl.N_cl = C.N_cl
  INNER JOIN detailcommande DC ON C.N_com = DC.N_com
  INNER JOIN produit         P ON DC.N_pr = P.N_pr
  INNER JOIN fournisseur     F ON F.N_fou = P.N_fou
WHERE Cl.pays NOT IN (
    SELECT DISTINCT(pays) FROM fournisseur
);
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: