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 :

Syntaxe pour requête récursive


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 40
    Points : 27
    Points
    27
    Par défaut Syntaxe pour requête récursive
    Bonjour à toutes et à tous,

    Je cherche un peu d'aide pour une requete récursive. Par facilité (pour vous et pour moi) je simplifierai l'exemple pour lequel je cherche de l'aide en espérant pouvoir l'adapter à ma situation réelle (infiniment plus complexe).

    J'ai une table servant à établir la chaine connectique entre différents appareils (vous pouvez les voir simplement comme des modules avec une entrée et une sortie). Dans cette table je stocke simplement les ID des instruments en entrée et en sortie.

    Pour tenter de rendre les choses plus claires j'ai quelque chose dans ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    table ais_connect
     
    SENSOR_ID_IN   |   SENSOR_ID_OUT
    ------------------------------------
    25      | 4
    26      | 3
    1000    | 25
    1001    | 1000

    Ce qui signifie en pratique que la sortie de l'instrument 4 est connectée à l'entrée de l'instrument 25 dont la sortie est reliée à l'entrée de l'intrument 1000 dont la sortie est reliée à l'entrée de l'instrument 1001.

    Je cherche donc à faire une requete qui me liste l'ordre de la connectique sachant que je dois partir de l'instrument 4.

    Pour l'instant j'ai tenté quelque chose comme ceci (qui risque de choquer les âmes sensibles mais qui ne tente rien n'a rien) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    WITH
        chain(out, in)
    AS(
        SELECT sensor_id_out, sensor_id_in
        FROM ais_connect
        WHERE sensor_id_out=4
        UNION ALL
        SELECT sensor_id_out, sensor_id_in
        FROM ais_connect V
            INNER JOIN chain c
                ON c.out = V.in)
    SELECT *
    FROM chain
    ;
    Mais je reçois un message d'erreur me disant que je ne peux aliaser chain( etc.

    Pour info j'utilise une base oracle via sqlplus sous linux.

    Qqun aurait-il de quoi me mettre sur la voie ?

    D'avance, merci pour votre aide!

  2. #2
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir vigon,


    Il faudrait déjà remplacer « IN » par autre chose, car c’est un mot réservé en SQL.

    Ensuite, quand vous écrivez « ON c.out = V.IN », ça devrait aller mieux avec « ON c.IN = V.sensor_id_out »...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par vigon Voir le message
    Pour info j'utilise une base oracle via sqlplus sous linux.
    Quelle est votre version ?
    La syntaxe avec une expression de table récursive n'a été implémentée qu'à partir de la 11gR2.
    Pour les versions précédentes, vous êtes obligé de passer par la clause CONNECT BY :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        select level, t.*
          from ais_connect t
    start with SENSOR_ID_OUT = 4
    connect by SENSOR_ID_OUT = prior SENSOR_ID_IN;
     
    LEVEL SENSOR_ID_IN SENSOR_ID_OUT
    ----- ------------ -------------
        1           25             4
        2         1000            25
        3         1001          1000

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 40
    Points : 27
    Points
    27
    Par défaut
    Un grand merci pour ces réponses!

    La solution de Waldar m'était inconnue (on en apprend tous les jours) et est d'une déconcertante simplicité syntaxique!

    Il ne me reste "plus qu'à" adapter ça en super-requete dans mon problème réel .

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

Discussions similaires

  1. Syntaxe pour requête SQL avec variables
    Par molibri dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/07/2010, 14h50
  2. syntaxe d'une requête récursive
    Par dug dans le forum SQL
    Réponses: 3
    Dernier message: 18/06/2009, 17h58
  3. [heritage] quelle syntaxe pour les requêtes avec Mysql
    Par tavarlindar dans le forum Requêtes
    Réponses: 7
    Dernier message: 07/05/2008, 23h47
  4. Syntaxe pour couper une requête
    Par Mike619 dans le forum VBA Access
    Réponses: 4
    Dernier message: 13/03/2008, 13h02
  5. Syntaxe PARAMETERS pour requête sous VBA
    Par GAGNON dans le forum VBA Access
    Réponses: 3
    Dernier message: 28/11/2003, 11h39

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