Meilleur auteur de réponses
Valeurs par défaut et valeurs spécifiques

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_datesAu 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
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- Proposé comme réponse Ciprian Duduiala mercredi 25 janvier 2012 07:53
- Marqué comme réponse Ciprian Duduiala vendredi 27 janvier 2012 08:21
-
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".- Proposé comme réponse Ciprian Duduiala mercredi 25 janvier 2012 07:53
- Marqué comme réponse Ciprian Duduiala vendredi 27 janvier 2012 08:21
-
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- Proposé comme réponse Patrice ScribeMVP mercredi 25 janvier 2012 09:03
- Marqué comme réponse Ciprian Duduiala vendredi 27 janvier 2012 08:21
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- Proposé comme réponse Ciprian Duduiala mercredi 25 janvier 2012 07:53
- Marqué comme réponse Ciprian Duduiala vendredi 27 janvier 2012 08:21
-
-
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".- Proposé comme réponse Ciprian Duduiala mercredi 25 janvier 2012 07:53
- Marqué comme réponse Ciprian Duduiala vendredi 27 janvier 2012 08:21
-
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
-
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- Proposé comme réponse Patrice ScribeMVP mercredi 25 janvier 2012 09:03
- Marqué comme réponse Ciprian Duduiala vendredi 27 janvier 2012 08:21