Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/03/2011, 15h07   #1
Membre habitué
 
Femme Chris
Développeur Web
Inscription : mai 2010
Messages : 225
Détails du profil
Informations personnelles :
Nom : Femme Chris
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mai 2010
Messages : 225
Points : 103
Points : 103
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 :
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
chris0938 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 12h41   #2
Modérateur
 
Inscription : octobre 2008
Messages : 1 505
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 505
Points : 2 034
Points : 2 034
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
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 10h35   #3
Membre habitué
 
Femme Chris
Développeur Web
Inscription : mai 2010
Messages : 225
Détails du profil
Informations personnelles :
Nom : Femme Chris
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mai 2010
Messages : 225
Points : 103
Points : 103
Bonjour, et merci pour avoir jeter un œil a mon probléme.

Effectivement la version de postgresql n'est pas celle que je pensais.
chris0938 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 10h25   #4
Membre habitué
 
Femme Chris
Développeur Web
Inscription : mai 2010
Messages : 225
Détails du profil
Informations personnelles :
Nom : Femme Chris
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mai 2010
Messages : 225
Points : 103
Points : 103
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.
chris0938 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 17h52   #5
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
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
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 09h22   #6
Membre habitué
 
Femme Chris
Développeur Web
Inscription : mai 2010
Messages : 225
Détails du profil
Informations personnelles :
Nom : Femme Chris
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mai 2010
Messages : 225
Points : 103
Points : 103
[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 :
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;
chris0938 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h54.


 
 
 
 
Partenaires

Hébergement Web