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

Requêtes PostgreSQL Discussion :

Récursivité + CASE + jointure


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2012
    Messages : 16
    Points : 10
    Points
    10
    Par défaut Récursivité + CASE + jointure
    Salut à toutes et à tous !

    J'ai un algorithme assez complexe que je n'arrive pas à résoudre, je m'explique en simplifiant :

    J'ai trois tables :

    tab_maj (id, name)
    tab_link (id_maj, id_loc, type)
    id_maj pointe sur id de tab_maj
    id_loc pointe sur id de tab_loc
    tab_loc (id, name, id_parent)
    id_parent pointe sur id de tab_loc

    Je cherche à récupérer une ligne tel que :
    tab_maj.id, tab_maj.name, tab_loc.id, tab_loc.name

    Mais là où tous ce complique c'est que en fonction de la valeur du champ tab_link.type (qui est un booléen), j'ai un traitement différent à faire :
    Si type est à false, on retourne la ligne telle quelle
    Si type est à true, on ne retourne pas une ligne mais X ligne en fonction des fils du tab_loc.id que l'on a

    Exemple :

    Je récupère :
    tab_maj.id, tab_maj.name, tab_loc.id, tab_loc.name, tab_link.type
    1 'Test1', 5, 'Paris 13', false
    2 'Test2', 10 'Lyon', true

    Dans ce cas là, on récupère la première ligne telle quelle car le type est à false.

    Mais pour la deuxième ligne, on ne la retourne pas elle même car le type est à true; on retourne autant de ligne que le nombre de fils de la ville.
    C'est à dire que pour la ville de Lyon qui est d'ID 10, on va récupérer toutes les autres villes qui l'ont en tant que parent_id et cela de façon récursive afin de récupérer tous ses descendants (ses fils, les fils de ses fils, etc...).

    Donc, si la ville de Lyon a 3 fils qui ont chacun 2 fils, j'ai un total de 6 lignes à retourner.
    Et surtout, je ne retourne pas la ligne initial qui correspond à la ville de Lyon !

    Je précise que tout ceci est sous PostgreSQL dans une fonction.

    J'ai tenté un CASE sur le INNER JOIN entre tab_link et tab_loc avec une condition sur le type mais cela ne fonctionne pas ou je m'y prend mal.
    Dans le cas où le type est à false, je fais la jointure habituelle sinon j'utilise WITH RECURSIVE cte AS () pour récupérer tous les fils de la ville mais la requête refuse que je lui donne plusieurs résultats.

    J'espère avoir été assez compréhensible, n'hésitez pas à me poser des questions !

    Merci d'avance pour vos réponses !

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Postez le DDL de vos tables et conformez vous à la charte : http://www.developpez.net/forums/a69...gage-sql-lire/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  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,

    Postez un jeu d'essai sous forme de CREATE TABLE + INSERT, ainsi que le résultat attendu, on pourra mieux vous aider.

Discussions similaires

  1. decode, jointure ou case
    Par titi04 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 24/09/2009, 14h30
  2. Réponses: 5
    Dernier message: 26/02/2008, 12h42
  3. récursivité ou auto-jointure
    Par oolon dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 20/09/2006, 16h59
  4. [SQL server 2000] Problème de jointure avec 'Case'
    Par Tankian dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/06/2006, 17h42
  5. Script avec JOINTURE et CASE
    Par Labienus dans le forum Langage SQL
    Réponses: 6
    Dernier message: 27/02/2004, 09h40

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