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 :

Requêtes récursives : pas compris..


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Mai 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 177
    Points : 79
    Points
    79
    Par défaut Requêtes récursives : pas compris..
    Bonjour à tous,

    Je vais aller droit au but :
    Je ne comprends pas vraiment la logique d'une requête récursive sur CTE.

    code récupéré là
    http://sqlpro.developpez.com/cours/s...te-recursives/
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    -- creation de la table
    CREATE TABLE T_VEHICULE
    (VHC_ID         INTEGER NOT NULL PRIMARY KEY,
     VHC_ID_FATHER  INTEGER FOREIGN KEY REFERENCES T_VEHICULE (VHC_ID),
     VHC_NAME       VARCHAR(16))
    -- population
    INSERT INTO T_VEHICULE VALUES (1, NULL, 'ALL')
    INSERT INTO T_VEHICULE VALUES (2, 1, 'SEA')
    INSERT INTO T_VEHICULE VALUES (3, 1, 'EARTH')
    INSERT INTO T_VEHICULE VALUES (4, 1, 'AIR')
    INSERT INTO T_VEHICULE VALUES (5, 2, 'SUBMARINE')
    INSERT INTO T_VEHICULE VALUES (6, 2, 'BOAT')
    INSERT INTO T_VEHICULE VALUES (7, 3, 'CAR')
    INSERT INTO T_VEHICULE VALUES (8, 3, 'TWO WHEELS')
    INSERT INTO T_VEHICULE VALUES (9, 3, 'TRUCK')
    INSERT INTO T_VEHICULE VALUES (10, 4, 'ROCKET')
    INSERT INTO T_VEHICULE VALUES (11, 4, 'PLANE')
    INSERT INTO T_VEHICULE VALUES (12, 8, 'MOTORCYCLE')
    INSERT INTO T_VEHICULE VALUES (13, 8, 'BICYCLE')
     
    WITH 
       tree (data, id)
       AS (SELECT VHC_NAME, VHC_ID_FATHER
           FROM   T_VEHICULE
           WHERE  VHC_NAME = 'MOTORCYCLE'
           UNION ALL
           SELECT VHC_NAME, VHC_ID_FATHER
           FROM   T_VEHICULE V
                  INNER JOIN tree t
    -- ne comprends pas cette jointure là
                        ON t.id = V.VHC_ID)
    SELECT *
    FROM   tree
    Cette jointure "ON t.id = V.VHC_ID" me reste étrangère.

    Questions :

    1) Pourquoi a-t'on v.vhc_id et pas v.vhc_father dans ON t.id = V.VHC_ID) ? Je ne comprends pas comment on passe au niveau suivant puisqu'on sélectionne le même id que celui dont on dispose déjà (évidemment je sais que j'ai tord là mais je ne comprends pas pourquoi).
    En fait, je ne comprends pas la double sélection à cause de cela.

    2) il me semble que les colonnes (data, id) dans tree (data, id) sont facultatives, non?

    Je ne suis pas vraiment dans la partie informatique mais je ne peux plus passer à côté, ça me plombe de ne pas comprendre. Attention, je ne suis pas très intelligent, veuillez ne pas prendre trop de raccourcis dans l'explication

    Merci à tous

  2. #2
    Membre régulier
    Inscrit en
    Mai 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 177
    Points : 79
    Points
    79
    Par défaut
    Ah bah si..

    Ce n'est qu'une question d'ordre de passe..

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    En fait, la jointure fait bien référence à VHC_ID_FATHER !

    Lors de la déclaration de la CTE, des noms de colonne sont spécifiés : tree (DATA, id).
    Lors des select, la deuxième colonne (id) correspond à VHC_ID_FATHER : SELECT VHC_NAME, VHC_ID_FATHER.

    donc dans la jointure, t.id correspond à la colonne VHC_ID_FATHER

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

Discussions similaires

  1. Requête récursive dans access
    Par Australia dans le forum Requêtes et SQL.
    Réponses: 15
    Dernier message: 29/07/2014, 15h15
  2. Requête récursive ne fonctionne pas sous VS
    Par Abdellah2010 dans le forum VB.NET
    Réponses: 1
    Dernier message: 16/09/2011, 08h52
  3. connection à chaque requête ou pas ?
    Par eschaer dans le forum Requêtes
    Réponses: 3
    Dernier message: 17/05/2005, 13h57
  4. Requête récursive
    Par tirixil dans le forum Bases de données
    Réponses: 3
    Dernier message: 07/03/2005, 16h11
  5. LIKE de tout ce qui n'est pas compris entre a<-&
    Par DjinnS dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/07/2003, 13h09

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