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 :

Table de liaison "facultative"


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2003
    Messages : 29
    Points : 24
    Points
    24
    Par défaut Table de liaison "facultative"
    Bonjour, je suis en train de concevoir une application et j'ai un problème dans la réalisation d'une requête SQL.

    En simplifiant:

    J'ai 3 tables :

    STATION
    ----------

    PK STAT_ID
    DESCRIPTION

    CRITERIA
    -----------

    PK CRIT_ID
    DESCRIPTION

    CRITERIA_STATION
    -----------------------

    FK STAT_ID
    FK CRIT_ID
    VALUE

    CRITERIA_STATION fait donc liaison entre STATION et CRITERIA.

    la table station représente des gares, par exemple:
    bruxelles midi, bruxelles nord.

    la table critère représente des caractéristique de chaque gare: code postal, ville, etc

    criteria station donne la valeur des critères pour une gare donnée : par exemple bruxelles midi a pour code postal 1020.

    Mon problème est que je n'ai pas forcément d'enregistrement dans la table de liaison et j'aimerais pouvoir récupérer

    station: bruxelles midi
    critère: ville
    value: NULL

    si par exemple le critère ville est absent dans la table de liaison pour la gare de bruxelles midi.
    J'aimerais donc comme résultat avoir toujours un resultat par critère pour une station donnée avec comme valeur pour se critère soit null si ca n'est pas dans la table de liaison soit la valeur de la trable de liaison.

    Comment faire ?

    Merci d'avance.

  2. #2
    Nouveau membre du Club
    Inscrit en
    Mai 2002
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 35
    Points : 36
    Points
    36
    Par défaut
    Il suffit de créer un tuple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    station: bruxelles midi 
    critère: ville 
    value: NULL
    Dans ta table Criteria_Station...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2003
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    Etant donné le nombre de records dans la table critère, j'aime autant ne pas avoir à créer de ligne dans la table criteria-station si elle n'apporte pas d'information.

    De plus les informations de la table criteria sont assez variables. Si je rajoute un record dans criteria je dois en rajouter 500 (pour les ~500 records de la table station) dans criteria-station.

  4. #4
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Quel est ton SGBD ?

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mai 2002
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 35
    Points : 36
    Points
    36
    Par défaut
    STATION
    ----------

    PK STAT_ID
    DESCRIPTION

    CRITERIA
    -----------

    PK CRIT_ID
    DESCRIPTION

    CRITERIA_STATION
    -----------------------

    FK STAT_ID
    FK CRIT_ID
    VALUE

    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
        /*Récupération des critères valorisés*/
       (SELECT s.description, c.description, cs.value
        FROM station s, criteria c, criteria_station cs
        WHERE s.stat_is = cs. stat_id
             AND c.crit_id = cs.crit_id)
    UNION
        /*Récupération des critères non valorisés*/
        (SELECT s.description, c.description, NULL
        FROM station s, criteria c
        WHERE NOT EXISTS 
           (SELECT cs.stat_id, cs.crit_id 
            FROM criteria_station cs
            WHERE c.crit_id = cs.crit_id
            AND s.stat_id = cs.stat_id)
        )
    Je ne garantie pas l'optimisation, mais ça devrait marcher...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2003
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    c'est une solution mais 3 select ca fait lourd.

    y a t'il moyen de faire un STATION CROSS JOIN CRITERIA et de compléter les lignes qui m'arrangent avec une jointure CRITERIA_STATION INNER JOIN CRITERIA ON CRITERIA_STATION.CRIT_ID = CRITERIA.CRIT_ID

    ?

  7. #7
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Essaye :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT s.description, c.description, cs.value 
    FROM station s CROSS JOIN criteria c
                   LEFT JOIN  criteria_station cs ON s.stat_is = cs.stat_id 
                                                 AND c.crit_id = cs.crit_id

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2003
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par Médiat
    Essaye :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT s.description, c.description, cs.value 
    FROM station s CROSS JOIN criteria c
                   LEFT JOIN  criteria_station cs ON s.stat_is = cs.stat_id 
                                                 AND c.crit_id = cs.crit_id
    YES ! merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

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