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

SQL Oracle Discussion :

Lien entre trois tables


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2021
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Lien entre trois tables
    Bonjour tout le monde, j'espère que vous allez bien.

    Je suis nouveau ici et j'aimerais vous demander un petit coup de main ^^"

    J'ai une série d'exercices pour m'entrainer sur un langage que j'apprends, le SQL Oracle. Mais il y en a un, j'ai beau me casser la tête depuis plus de trois jours, ça ne vient pas.

    L'intitulé c'est :

    Affichez le numéro du train, le nom du train et le nombre de places. Ne prendre en compte que les trains qui ont parcouru une distance supérieure à 300 Km le 22/10/2020 et pour lesquels des billets ont été réservés.

    Triez les résultats par le numéro du train.
    Voici les différentes tables :



    Donc en gros, il existe 4 types de T_WAGON, WAGON_ID = 1 veut dire que c'est le premier type de wagon, qui possède NB_SEAT = 30. WAGON_ID = 2 veut dire qu'il y a NB_SEAT = 20. Et dans un train, on a par exemple 6 WAGON_ID = 1 et 7 WAGON_ID = 2.
    Mon problème, c'est que je n'arrive pas à passer de T_TRAIN (les trains qui sont partis le 22 et qui ont fait 300 kilomètres - ça j'y arrive) à faire la SUM de toutes les NB_SEAT du même train et l'afficher...

    Mon code :

    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 DISTINCT tra.train_id "Nø train", tra.departure_time "Heure de depart", dep.city ||' - '|| dest.city "Depart - Arrivee", 
    (SELECT SUM(E.NB_SEAT) FROM T_WAGON e JOIN T_WAGON_TRAIN g ON E.WAGON_ID = G.WAG_TR_ID JOIN T_TRAIN t ON G.WAG_TR_ID = T.TRAIN_ID WHERE T.TRAIN_ID = tra.train_id) "Nombre de place"
     
    FROM t_train tra
    JOIN t_wagon_train wagtra
    ON tra.train_id = wagtra.train_id
    JOIN t_wagon wag
    ON wagtra.wagon_id = wag.wagon_id
    JOIN vu_station dep
    ON dep.station_id = tra.departure_station_id
    JOIN vu_station dest
    ON dest.station_id = tra.arrival_station_id
    JOIN t_ticket tic
    ON wagtra.wag_tr_id = tic.wag_tr_id
    WHERE tra.distance > 300 AND tic.reservation_id IS NOT NULL AND TO_CHAR(tra.departure_time, 'DD/MM/YYYY') LIKE '22/10/2020'
    ORDER BY tra.train_id
    /
    Qui donne



    C'est surement un code horrible et très moche j'en suis navré, je débute xD

    Si quelqu'un à un conseil ou une astuce, j'aimerais bien savoir comment faire.

    Bien à vous !

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,

    Je pense que tu t'es juste trompé au niveau des jointures dans ta requêtes scalaire:

    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
    18
    19
    20
    21
    SELECT tra.train_id "Nø train", 
           tra.departure_time "Heure de depart",
           dep.city ||' - '|| dest.city "Depart - Arrivee", 
           (SELECT SUM(E.NB_SEAT)
            FROM T_WAGON e
            JOIN T_WAGON_TRAIN g ON E.WAGON_ID = G.WAGON_ID 
            WHERE G.TRAIN_ID = tra.train_id) "Nombre de place"  
    FROM t_train tra
    JOIN vu_station dep
    ON dep.station_id = tra.departure_station_id
    JOIN vu_station dest
    ON dest.station_id = tra.arrival_station_id
    WHERE tra.distance > 300 
      AND tra.departure_time >= TO_DATE('22/10/2020', 'dd/mm/yyyy') AND tra.departure_time < TO_DATE('23/10/2020', 'dd/mm/yyyy')
      AND EXISTS (select 1 from t_wagon_train wagtra
                  join t_ticket tic ON wagtra.wag_tr_id = tic.wag_tr_id  
                  where wagtra.train_id = tra.train_id
                    and tic.reservation_id IS NOT NULL 
                  )
    ORDER BY tra.train_id
    /
    J'ai modifié légèrement pour ajouter un condition EXISTS plutôt qu'une jointure sur t_wagon_train et t_ticket afin d'éliminer le DISTINCT. De plus, j'ai réécrit la condition sur la date, car en principe on applique les fonctions de conversion sur les valeurs, pas sur les colonnes pour que l'utilisation d'un index puisse éventuellement se faire.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2021
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    merci beaucoup pour ton aide, c'est plus que demandé et c'est vraiment sympa J'ai une dernière interrogation, je n'arrive pas à trouver la réponse sur le web.

    Pour ce code :

    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
    18
    19
    20
    21
    22
    SELECT tra.train_id "Nø train",
           dep.city ||' - '|| dest.city "Depart - Arrivee", 
     
            (SELECT COUNT(tick.WAG_TR_ID)
            FROM T_TICKET tick
            JOIN T_WAGON_TRAIN g ON tick.WAG_TR_ID = G.WAGON_ID 
            WHERE G.TRAIN_ID = tra.train_id
            ) "Nombre de place"
     
    FROM t_train tra
    JOIN vu_station dep
    ON dep.station_id = tra.departure_station_id
    JOIN vu_station dest
    ON dest.station_id = tra.arrival_station_id
    WHERE EXISTS (select 1 from t_wagon_train wagtra
                  join t_ticket tic ON wagtra.wag_tr_id = tic.wag_tr_id  
                  where wagtra.train_id = tra.train_id
                    and tic.reservation_id IS NOT NULL 
                  )
    ORDER BY tick.WAG_TR_ID
    fetch first 5 rows only;
    /
    Je dois faire un TOP - 5 du nombre de places occupées. Sauf que quand je fais un ORDER BY tick.WAG_TR_ID ça ne fonctionne pas puisque tick.WAG_TR_ID est une sous requête... vous connaissez une alternative?


    Bien à vous !

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,

    Dans la clause ORDER BY tu peux référencer les alias indiqués dans la clause SELECT, ou utiliser la notation positionnelle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ORDER BY "Nombre de place"
    fetch first 5 rows only;
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ORDER BY 3
    fetch first 5 rows only;
    Mais je suppose qu'il faut un DESC aussi si tu veux le top 5 plus élevé?

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2021
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    En effet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ORDER BY "Nombre de place"
    fetch first 5 rows only;
    ça fonctionne très bien, je n'avais pas compris qu'on pouvait utiliser l'alias dans les order by et non la table appelée... Grosse perte de temps là dessus ^^" Merci infiniment pour ton temps.

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

Discussions similaires

  1. Liens entre trois tables
    Par frites.saucisse dans le forum Requêtes
    Réponses: 4
    Dernier message: 16/10/2012, 11h45
  2. [Conception]Lien plusieurs à plusieurs entre trois table
    Par egg3774 dans le forum Modélisation
    Réponses: 5
    Dernier message: 20/04/2007, 17h44
  3. requete entre trois tables
    Par fpouget dans le forum Langage SQL
    Réponses: 8
    Dernier message: 08/03/2005, 21h44
  4. [VB.NET] ComboBox lien entre deux tables
    Par VDB1 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 15/07/2004, 12h15
  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, 16h00

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