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 :

Jointure avec une table recursive


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 8
    Par défaut Jointure avec une table recursive
    Bonsoir,

    A partir d'une table structurée de cette façon :


    id clé primaire
    libelle
    id_pere clé_etrangére

    j'effectue la requête suivante :

    SELECT t1.libelle, t2.libelle
    FROM table t1 LEFT JOIN table t2 ON t1.id=t2.pere
    WHERE t1.id=1
    La première colonne du résultat me donne bien les enregistrements de 1er niveau, et la deuxième colonne ceux de deuxième niveau. Mais je souhaiterais également obtenir les enregistrements de 1er niveau, sans enregistrement de second niveau. C'est pour cette raison que j'ai effectué une jointure externe, mais qui malheureusement ne semble pas fonctionner.

    Est-ce posssible ?

    Merci d'avance pour vos éclaircissement.

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    FROM table t1 LEFT JOIN table t2 ON t1.id=t2.pere
    ...
    N'est pas une jointure externe.

  3. #3
    Membre éclairé
    Inscrit en
    Juillet 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 76
    Par défaut
    La jointure externe ne fonctionne pas comme le voudriez parce que le resultat renvoi les jointures valides s'il en trouve et vide sinon. j'imagine que ds votre cas il existe des jointures valides pour votre id.

    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
    with t as (
    select 1 as id,'id1' as libelle, null as pere from dual union all
    select 2 ,'id2' , 1 from dual union all
    select 3 ,'id3' , 1 from dual union all
    select 4 ,'id4' , null from dual
    )
    /*select distinct lib1,lib2
    FROM
    (*/
    select t1.libelle as lib1, t2.libelle as lib2
    FROM t t1 JOIN t t2 ON t1.id=t2.pere
    WHERE t1.id=1
    union --all
    select t1.libelle, null
    FROM t t1
    WHERE t1.id=1
    /*)*/
     
    LIB1	LIB2
    id1	id2
    id1	
    id1	id3

    J'ai l'idée que certains gurus vont me tomber sur le dos...

    Edition: supp du distinct

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Les arborescences sont gérées avec CONNECT BY sous Oracle :
    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
    with t as
    (
    select 1 as id,'id1' as libelle, null as pere from dual union all
    select 2      ,'id2'           , 1            from dual union all
    select 3      ,'id3'           , 1            from dual union all
    select 4      ,'id4'           , null         from dual
    )
     select connect_by_root id as id_init,
            id, libelle, pere,
            ltrim(sys_connect_by_path(id, ' / '), ' / ') as chemin
       from t
      start with pere is null
    connect by prior id = pere;
     
    ID_INIT	ID	LIBELLE	PERE	CHEMIN
    1	1	id1		1
    1	2	id2	1	1 / 2
    1	3	id3	1	1 / 3
    4	4	id4		4

Discussions similaires

  1. Jointure avec une table d'historique et sélection du plus récent
    Par thor76160 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 13/07/2011, 11h36
  2. jointure avec une table incrémentée
    Par pp_le_moko dans le forum Débuter
    Réponses: 4
    Dernier message: 09/12/2009, 17h09
  3. jointure avec une table dans une autre DB
    Par bastringue dans le forum Langage SQL
    Réponses: 3
    Dernier message: 26/05/2008, 15h34
  4. Réponses: 1
    Dernier message: 18/07/2007, 11h58
  5. Réponses: 1
    Dernier message: 18/01/2006, 17h51

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