none
Valeurs par défaut et valeurs spécifiques RRS feed

  • Question

  • Bonjour à tous,

    Je souhaite faire une requête qui donne des valeurs spécifiques, et en absence de ces valeurs, des valeurs par défaut.

    Je m'explique. J'ai une table "voyages", une table "tarifs", une table "voyage_dates" et une table "tarifs_date".
    Pour 1 voyage, j'ai plusieurs tarifs (adultes, enfants)  et plusieurs dates de départ.
    Chaque tarif a un prix par défaut (ex adultes 200, enfants 150), mais en fonction des dates ces prix peuvent changer.
    Par exemple :
    le 15/06 adultes = 220 et enfants = 160 (les deux prix ont changé soit 2 enregistrements dans la table tarifs_date)
    le 20/06 adultes = 230 et enfants reste au prix de base 150 (un seul prix a changé, soit 1 seul enregistrement dans tarifs_date).

    Je construis donc une jointure entre voyages_dates et tarifs, ce qui me permet pour chaque date d'avoir les tarifs par défaut, mais je veux aussi afficher le tarif modifié par date s'il existe.  

    j'ai donc la jointure voyages_dates.fk_voyage = tarifs.fk_voyage

    Les deux foreign keys fk_voyage pointent sur la clé primaire de voyage.

    Ensuite pour utiliser la table tarifs_date, j'ai besoin de la relier à tarifs, mais aussi à voyage_dates pour avoir les tarifs des dates qui m'intéressent.

    J'ai donc deux nouvelles jointures :
    tarifs.cle_tarifs = tarifs_date.fk_tarifs et
    voyages_dates.cle_voyages_dates = tarifs_date.fk_voyages_dates

    Au total j'ai donc trois table reliées en triangle.

    Mais la dernière jointure contraint ma requête, et s'il n'y a pas de tarifs_date pour cette date, la requête ne retourne aucun résultat.

    Si la table tarifs_date devient une sous-requête, avec en condition fk_voyages_dates = XX, ça fonctionne, mais je ne peux pas passer "manuellement" cette valeur à chaque date de voyages_date.

    Si quelqu'un a une idée de construction de cette requête ce serait vraimment top.

    Merci d'avance

    Christophe

     

     

    mardi 24 janvier 2012 14:55

Réponses

  • Bonjour,

    un left outer join vous permets de selecter tous les records du table a gauche, et seulement les records correspondants du table a droite. Combiné avec la fonction 'Coalesce', il devrait etre possible d' avoir un prix en toutes les cas.


    Regards, Nico
    mardi 24 janvier 2012 15:07
  • Bonjour,

    Je pense que Nico voulait plutôt dire :

    SELECT COALESCE(c.Tarif,b.Tarif)
    FROM a
    LEFT JOIN b etc...
    LEFT JOIN c etc...

    ce qui permet de prendre le tarif trouvé dans la table "c" si pas NULL, sinon dans la table "b"...


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    mardi 24 janvier 2012 18:13
  • Bonjour,

    oui, je comprends, en fait je fais déjà case when c.Tarif IS NOT NULL THEN c.Tarif ELSE b.Tarif END...
    ce qui revient au même (en plus long...)

    Mon problème vient en fait de la double jointure sur la dernière table "tarifs_date", qui provoque une double condition, qui n'est remplie que pour les lignes de "tarifs_date" existantes, de ce fait, les lignes pour lesquelles il n'y a pas de valeur dans "tarifs_date" disparaissent 

    oui, et c'est pour ça qu'il faut un left outer join.

    Si vous voulez un conseil plus specifique sur Sql, il est plus façile quand vous montrez un script qui cree les tables, qui rentre un nobre de records dans les tables, et un example du resultat desiré.

     


    Regards, Nico
    mercredi 25 janvier 2012 08:25

Toutes les réponses

  • Bonjour,

    un left outer join vous permets de selecter tous les records du table a gauche, et seulement les records correspondants du table a droite. Combiné avec la fonction 'Coalesce', il devrait etre possible d' avoir un prix en toutes les cas.


    Regards, Nico
    mardi 24 janvier 2012 15:07
  • Bonjour,

    Merci pour ta réponse.

    Tu veux dire que je peux mettre le coalesce dans le left outer join ?

    par exemple

     tarifs LEFT OUTER JOIN tarifs_date ON tarifs.cle_tarifs = COALESCE(tarifs_date.fk_tarifs,'')

    ?

    mardi 24 janvier 2012 17:08
  • Bonjour,

    Je pense que Nico voulait plutôt dire :

    SELECT COALESCE(c.Tarif,b.Tarif)
    FROM a
    LEFT JOIN b etc...
    LEFT JOIN c etc...

    ce qui permet de prendre le tarif trouvé dans la table "c" si pas NULL, sinon dans la table "b"...


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    mardi 24 janvier 2012 18:13
  • Bonjour,

    oui, je comprends, en fait je fais déjà case when c.Tarif IS NOT NULL THEN c.Tarif ELSE b.Tarif END...
    ce qui revient au même (en plus long...)

    Mon problème vient en fait de la double jointure sur la dernière table "tarifs_date", qui provoque une double condition, qui n'est remplie que pour les lignes de "tarifs_date" existantes, de ce fait, les lignes pour lesquelles il n'y a pas de valeur dans "tarifs_date" disparaissent 

    mercredi 25 janvier 2012 07:58
  • Bonjour,

    oui, je comprends, en fait je fais déjà case when c.Tarif IS NOT NULL THEN c.Tarif ELSE b.Tarif END...
    ce qui revient au même (en plus long...)

    Mon problème vient en fait de la double jointure sur la dernière table "tarifs_date", qui provoque une double condition, qui n'est remplie que pour les lignes de "tarifs_date" existantes, de ce fait, les lignes pour lesquelles il n'y a pas de valeur dans "tarifs_date" disparaissent 

    oui, et c'est pour ça qu'il faut un left outer join.

    Si vous voulez un conseil plus specifique sur Sql, il est plus façile quand vous montrez un script qui cree les tables, qui rentre un nobre de records dans les tables, et un example du resultat desiré.

     


    Regards, Nico
    mercredi 25 janvier 2012 08:25