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

PostgreSQL Discussion :

requête récursive with


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2010
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2010
    Messages : 245
    Par défaut requête récursive with
    Bonjour,
    j'ai une table domain(id,nom,parent) avec parent=id. Je souhaite faire une requête récursive pour récupérer les enfant d'un id précis.
    Avec oracle on avait connect by prior. En faisant des recherches je suis tombé sur with recursive. J'ai fait un essaye:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    WITH recursive ENFANT(nom,id) as
    (
        select nom,id
        from  domaine
        where id='33'
      union all
        select nom,id
        from domaine d,enfant e
        where d.id=e.parent
    )
    select nom,id from enfant;
    mais j'obtiens cette erreur:

    ERROR: syntax error at or near "WITH" at character 1
    LINE 1: WITH recursive ENFANT(nom,id) as


    est ce que ma requête est fausse ou il y a un autre probléme?
    merci d'avance pour toute précision.

    ps: version postgresql 8.4.2

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Vu le message d'erreur ça ne semble pas être la version 8.4 mais une version antérieure qui ne supporte pas ce type de requête.
    Pour être sûr, exécuter

  3. #3
    Membre éclairé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2010
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2010
    Messages : 245
    Par défaut
    Bonjour, et merci pour avoir jeter un œil a mon probléme.

    Effectivement la version de postgresql n'est pas celle que je pensais.

  4. #4
    Membre éclairé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2010
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2010
    Messages : 245
    Par défaut
    Bonjour,
    A présent ma version de postgres est la bonne pour utilise with recursive.

    je viens de lancer la requête mais cela doit bien faire 5minutes quelle tourne.
    est ce normal? combien de temps une requête récursive mets pour s'exécuter?

    [edit]
    la requete vient de se finir par ce message
    ERROR: write failed
    [/edit]

    merci d'avance.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 996
    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 996
    Billets dans le blog
    6
    Par défaut
    Votre requête compte de nombreuses erreurs !
    1) id est-il numérique ? Si oui, alors pourquoi le comparer à une chaine de caractères ??? id = '33'
    SQL est un langage typé et un nombre ne s'exprime pas sous la forme d'une chaine de caractères
    2) dans la requête d'itération, la clause SELECT comporte les colonnes nom et id mais de quelles tables viennent-ils ?
    3) vous faites des produits cartésiens, pas de jointures. Une jointure s'exprime dans une clause JOIN avec un prédicat de jointure ON !

    Bref, apprenez le langage SQL. Mon site web, comme mon livre, peuvent vous y aider.

    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/ * * * * *

  6. #6
    Membre éclairé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2010
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2010
    Messages : 245
    Par défaut
    [QUOTE=SQLpro;5908288]Votre requête compte de nombreuses erreurs !
    1) id est-il numérique ? Si oui, alors pourquoi le comparer à une chaine de caractères ??? id = '33'
    SQL est un langage typé et un nombre ne s'exprime pas sous la forme d'une chaine de caractères
    id un varchar donc entre cote fonctionne

    2) dans la requête d'itération, la clause SELECT comporte les colonnes nom et id mais de quelles tables viennent-ils ?
    effectivement sur ce point j'ai fait une erreur mais je n'avais jamais fait de requête récursive avec postgresql

    3) vous faites des produits cartésiens, pas de jointures. Une jointure s'exprime dans une clause JOIN avec un prédicat de jointure ON !
    J'ai appris le sql en faisant des jointure comme cela.
    la requete suivante fonctionne trés bien avec un where:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    WITH recursive enfant(idEnfant,nomEnfant,level) AS
    (
         SELECT d.id,d.nom,1 
    	 FROM domaine d WHERE d.id=BE509765  
       union ALL
         SELECT d.id,d.nom,e.level + 1     
    	 FROM domaine d,enfant e 
    	 where d.parent=e.idEnfant
    	 )
    SELECT * FROM enfant ORDER BY level;

+ 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. Réponses: 4
    Dernier message: 04/05/2006, 19h01
  3. [SQL Server]Problème avec une requête récursive
    Par evans dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/04/2006, 20h16
  4. [SQL Server] Requête récursive
    Par margagn dans le forum Langage SQL
    Réponses: 8
    Dernier message: 01/04/2006, 04h31
  5. Requête récursive
    Par tirixil dans le forum Bases de données
    Réponses: 3
    Dernier message: 07/03/2005, 16h11

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