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

Langage SQL Discussion :

Lien entre 2 tables sans retrait


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    éditeur
    Inscrit en
    Octobre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : éditeur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 16
    Points : 10
    Points
    10
    Par défaut Lien entre 2 tables sans retrait
    Bonjour,

    La recherche est facile à énoncer ... mais je ne sais pas par où m'orienter au départ :

    2 tables : Produits et Promos avec un lien dans Promos qui reprend l'ID de Produits.

    Je voudrais afficher tous les produits mais quand c'est en promo, afficher le prix en promo !

    J'ai beau essayer ...

    Merci par avance

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 088
    Points : 38 393
    Points
    38 393
    Billets dans le blog
    9
    Par défaut
    Je suppose que les promos sont facultatives, du coup il faut utiliser une jointure externe de produit vers promo : OUTER JOIN.
    Ensuite, il faut utiliser la fonction COALESCE(Prix_promo, Prix_Std)pour prendre prioritairement le prix promo si présent, le prix standard à défaut.
    Attention : si en plus les promos sont applicables à période ou sur d'autres critères, il faut en tenir compte (ex : vérifier que la période de promotion encadre la date de vente)

  3. #3
    Membre à l'essai
    Homme Profil pro
    éditeur
    Inscrit en
    Octobre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : éditeur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Merci de votre réponse !

    Mais je ne sais où mettre ces mentions dans ma requête. suis débutant !

    Merci par avance

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 088
    Points : 38 393
    Points
    38 393
    Billets dans le blog
    9
    Par défaut
    Si c'est dans le cadre d'un apprentissage, ce ne serait pas vous rendre service que de vous donner la réponse toute cuite.


    Qu'avez vous essayé comme requête ? Quel résultat avez-vous obtenu ? Un message d'erreur ? Lequel ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    éditeur
    Inscrit en
    Octobre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : éditeur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 16
    Points : 10
    Points
    10
    Par défaut Lien entre 2 tables sans retrait
    Citation Envoyé par escartefigue Voir le message
    Si c'est dans le cadre d'un apprentissage, ce ne serait pas vous rendre service que de vous donner la réponse toute cuite.


    Qu'avez vous essayé comme requête ? Quel résultat avez-vous obtenu ? Un message d'erreur ? Lequel ?
    Voici une des versions (j'en ai essayé bcq avant de vous appeler au secours !)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    SELECT 
    		Produits.Prod_ID,
    		Produits.Fam_ID,
    		Produits.SiteName,
    		Produits.PU,
    		Produits.Prod_HT,
    		Produits.Qte
    		Produits_promos.PPromos_ID,
    		Produits_promos.Prod_ID,
    		Produits_promos.Promotion,
    		Produits_promos.Promo_contenu,
    		Produits_promos.Promo_deb,
    		Produits_promos.Promo_fin 
    	FROM Produits,Produits_promos
    	WHERE Produits.SiteName='#Session.site#'
    		AND Produits.Fam_ID = 363
    	ORDER BY Produits.Prod_ID
    Merci par avance

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FROM Produits,Produits_promos
    Là, vous faites un produit cartésien des deux tables, puisque vous n'avez pas de condition de jointure dans la partie WHERE de la requête. De toute manière, depuis 1992, les jointures s'écrivent avec JOIN alors il serait temps de s'y mettre ! Si votre prof ne vous l'a pas appris, dites-lui de ma part qu'il doit se recycler ou qu'il est grand temps qu'il parte en retraite !

    Et comme vous l'a indiqué plus haut escartefigue, il vous faut dans ce cas une jointure externe.

    Bon lecture de l'article de SQLPro et bon apprentissage !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 088
    Points : 38 393
    Points
    38 393
    Billets dans le blog
    9
    Par défaut
    Outre l'absence de jointure explicite et donc le produit cartésien qui en résulte, on peut également noter que
    • WHERE Produits.SiteName='#Session.site#' ce filtre a peu de chance de fonctionner : les valeurs entre quotes simples sont des constantes, pas des variables !
    • préfixer le nom de chaque colonne par le nom de la table in extenso est peu pratique, l'usage d'alias est bien plus simple



    Sans mâcher complètement le travail voici une piste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT PR.Prod_ID
         , PR.Fam_ID
         , [...]
         , COALESCE(PP.Prix_Promo, PR.Prix_Std)
    FROM Produits         as PR
    (INNER, LEFT, RIGHT, FULL) JOIN 
         Produits_promos  as PP
      ON PP.ColonneX = PR.ColonneY
    WHERE PR.SiteName=@variable_site
      AND PR.Fam_ID = 363
    ORDER BY PR.Prod_ID
    Pour le type de jointure, le tuto mentionné par Cinephil vous permettra de choisir laquelle convient parmi (INNER, LEFT OUTER, RIGHT OUTER et FULL OUTER).
    J'avais effectivement donné un indice dans ma réponse précédente

  8. #8
    Membre à l'essai
    Homme Profil pro
    éditeur
    Inscrit en
    Octobre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : éditeur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    pour être complet je rajoute :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    <TR>
    								<TD class="txtmm">&nbsp;Quantité&nbsp;*</TD><!--- Quantité --->
    								<TD class="txtmm">
    									<SELECT name="form.Prod_ID" required="yes">
    										<OPTION class="txtmm" value="">Réponse Quantité requise</OPTION><!--- Réponse Quantité requise --->
    										</CFOUTPUT>
    										<CFOUTPUT query="TableProduits2">
    											<CFIF #TablePromos.Promotion# IS 0>
    												<OPTION class="txtmm" value="#Prod_ID#">#TableProduits2.Qte# cartiboks à #lsnumberformat(TableProduits2.PU,'9.99')# € HT pièce soit #lsnumberformat(TableProduits2.Prod_ht,'9.99')# € HT</OPTION>
    											<CFELSE>
    												<CFIF #TablePromos.Promo_contenu# IS "P">
    													<cfset PPU=(#PU#*(100-#TablePromos.Promotion#)/100)>
    													<cfset PHT=(#Prod_ht#*(100-#TablePromos.Promotion#)/100)>
    													<OPTION style="background: red"  value="#TableProduits2.Prod_ID#">#TableProduits2.Qte# cartiboks à #lsnumberformat(PPU,'9.99')# € HT pièce soit #lsnumberformat(PHT,'9.99')# € HT</span></OPTION>
    												</CFIF>
    												<CFIF #TablePromos.Promo_contenu# IS "Q">
    													<cfset PQte=(#TableProduits2.Qte#*(100+#TablePromos.Promotion#)/100)> 
    													<OPTION style="background: green"  value="#TableProduits2.Prod_ID#">#PQte# cartiboks à #lsnumberformat(TableProduits2.PU,'9.99')# € HT pièce soit #lsnumberformat(TableProduits2.Prod_ht,'9.99')# € HT</span></OPTION>
    												</CFIF>
    											</CFIF>
    										</CFOUTPUT>
    									</SELECT>
    								</TD>
    							</TR>

    Nom : Exemple.gif
Affichages : 110
Taille : 33,3 Ko

    Plus facile en photoshop hihihi

    Merci par avance

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 088
    Points : 38 393
    Points
    38 393
    Billets dans le blog
    9
    Par défaut
    Avez-vous essayé la solution que je vous ai proposée dans ma réponse n°7 ?

  10. #10
    Membre à l'essai
    Homme Profil pro
    éditeur
    Inscrit en
    Octobre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : éditeur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Bonjour,
    Excusez cette interruption due à une grosse grippe !
    J'ai essayé la solution 7... et d'autres !
    Mais malgré vos conseils pas de solution en vue.
    Je joins les 2 tables :
    Nom : Produits.jpg
Affichages : 90
Taille : 88,8 Ko
    Merci par avance

  11. #11
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 088
    Points : 38 393
    Points
    38 393
    Billets dans le blog
    9
    Par défaut
    Merci de publier la requête exacte testée le résultat obtenu et le message d'erreur le cas échéant.

Discussions similaires

  1. [ACCESS] lien entre 2 tables mais sans intégrité référentielle
    Par Philippe PONS dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 13/06/2007, 22h33
  2. Liens entre les tables
    Par zevince dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 25/10/2005, 16h25
  3. lien entre les tables
    Par cedric12 dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 04/10/2005, 00h39
  4. [VB.NET] ComboBox lien entre deux tables
    Par VDB1 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 15/07/2004, 13h15
  5. lien entre les table de paradox
    Par salim_intic1 dans le forum Bases de données
    Réponses: 2
    Dernier message: 13/05/2004, 17h00

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