PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 31/03/2011 15:03:10

chris0938
Membre

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:

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.

Dernière modification par chris0938 (31/03/2011 15:07:38)

Hors ligne

#2 31/03/2011 15:13:09

gleu
Administrateur

Re : requête récursive with

Je n'ai pas ce problème là. Vous avez dû mal saisir la requête ou alors elle est dans un fichier enregistré par pgAdmin (et donc avec un BOM au départ qui n'est pas apprécié par psql version 8.4 et antérieure).

Par contre, j'ai un autre problème. Vous donnez comme nom de "table virtuelle" le même nom qu'une table existante. Ça revient juste à chercher le maximum d'embêtement. Donnez lui un autre nom, ainsi qu'aux colonnes.


Guillaume.

Hors ligne

#3 31/03/2011 15:14:33

Marc Cousin
Membre

Re : requête récursive with

À vue de nez cette requête me semble correcte. En tout cas je n'ai pas de rejet d'erreur de syntaxe chez moi quand je l'essaye (je n'ai évidemment pas créé les tables).

Vous n'auriez pas un caractère parasite, comme un espace insécable au lieu d'un espace normal entre WITH et recursive ?


Marc.

Hors ligne

#4 31/03/2011 15:18:55

chris0938
Membre

Re : requête récursive with

Merci pour votre réponse. Enfaite l'erreur je l'obtiens quand j'écris la requête sous putty. je sais pas si cela a une importance.

gleu a écrit :

Par contre, j'ai un autre problème. Vous donnez comme nom de "table virtuelle" le même nom qu'une table existance. Ça revient juste à chercher le maximum d'embêtement. Donnez lui un autre nom, ainsi qu'aux colonnes.

Je ne comprends pas ce que vous voulez dire. ma table virtuelle enfant n'existe pas.

Hors ligne

#5 31/03/2011 15:23:29

Marc Cousin
Membre

Re : requête récursive with

Oui, c'est une erreur, enfant est bien la table virtuelle. Je pense que gleu a cru qu'il y avait en plus une table enfant (la casse différente probablement…).

Le fait que ça soit sous putty ne devrait pas avoir d'importance en soit, mais avez vous essayé de re-taper la requête ? Il est vraiment probable que vous ayez un caractère parasite quelque part… ce qui arrive souvent après un texte en majuscule par exemple: maj+espace saisit souvent un espace insécable, ce qui déplait au parser de requêtes.


Marc.

Hors ligne

#6 31/03/2011 15:30:08

gleu
Administrateur

Re : requête récursive with

Hmmm, ma confusion est dû au fait que la table virtuelle enfant n'a pas de colonne parent (elle n'a que id et nom) alors qu'une colonne parent est testé dans sa déclaration (where d.id=e.parent). Si j'essaie de deviner là où on veut en venir, ça me donne cette requête :

WITH recursive ENFANT(nom,id,parent) as
(
    select nom,id,33
    from  domaine
    where id='33'
  union all
    select e.nom,e.id,e.parent
    from domaine d,enfant e
    where d.id=e.parent
)

Guillaume.

Hors ligne

#7 31/03/2011 15:35:13

chris0938
Membre

Re : requête récursive with

j'ai essayé de faire la requête avec with recursive en minuscule mais j'ai la même erreur.

Hors ligne

#8 31/03/2011 15:37:30

gleu
Administrateur

Re : requête récursive with

Pas très étonnant, la casse des caractères ne compte pas pour la syntaxe.


Guillaume.

Hors ligne

#9 31/03/2011 15:43:59

chris0938
Membre

Re : requête récursive with

Enfaite c'était pouvoir si il y avait un espace insécable comme le disais Marc Cousin.
j'ai essaye la requête en mettant parent pour la table virtuelle mais toujours la même erreur.

Hors ligne

#10 31/03/2011 15:46:04

Marc Cousin
Membre

Re : requête récursive with

Le mieux, dans ce cas, ça serait que vous nous donniez la définition complète de la table, et une copie exacte (par copier coller) du dernier ordre. Pas besoin du contenu de la table, juste le CREATE TABLE.

Dernière modification par Marc Cousin (31/03/2011 15:46:25)


Marc.

Hors ligne

#11 31/03/2011 15:54:50

chris0938
Membre

Re : requête récursive with

voici ma table:

CREATE TABLE Domaine (
  id CHAR(25) NOT NULL,
  nom CHAR(35) NULL,
  parent CHAR(25) NULL,  
  PRIMARY KEY(id),  
  FOREIGN KEY(parent)REFERENCES Domaine(id)
      ON DELETE CASCADE
      ON UPDATE CASCADE
);

Hors ligne

#12 31/03/2011 16:37:44

Marc Cousin
Membre

Re : requête récursive with

Validé avec une 8.4.2 à l'instant:

WITH recursive ENFANT(nom,id,parent) as
(
    select nom,id,'33'
    from  domaine
    where id='33'
  union all
    select e.nom,e.id,e.parent
    from domaine d,enfant e
    where d.id=e.parent)
select nom,id from enfant;


Marc.

Hors ligne

#13 31/03/2011 16:50:49

chris0938
Membre

Re : requête récursive with

j'ai toujours la même erreur. pourtant j'ai fais un copier coller de votre requête.

Hors ligne

#14 31/03/2011 16:53:28

Marc Cousin
Membre

Re : requête récursive with

Êtes-vous vraiment sûr qu'il s'agit d'une 8.4.2 ? Parce que le message d'erreur aurait un sens, sur une version plus ancienne.

Que répond SELECT version() ?


Marc.

Hors ligne

#15 31/03/2011 17:02:57

chris0938
Membre

Re : requête récursive with

alors là!!
j'ai fait select version() et cela me dit que je suis sur PostgreSQL 8.1.8. Pourtant quand je vais dans les dossier pgsql c'est postgresql-8.4.2 qui si trouve. je comprends plus rien la.

Hors ligne

#16 31/03/2011 17:06:09

Marc Cousin
Membre

Re : requête récursive with

Il y a peut-être plusieurs moteurs en train de s'exécuter.

Pour savoir où se trouve la base que vous utilisez, essayez

SHOW data_directory;


Marc.

Hors ligne

#17 31/03/2011 17:12:53

chris0938
Membre

Re : requête récursive with

c'est bien la version 8.1 ou tourne ma base.
grrr.
bon je pense que la seule chose à faire c'est de réinstaller une version plus récente de postgres.

Hors ligne

#18 01/04/2011 10:24:05

chris0938
Membre

Re : requête récursive with

Bonjour, déjà merci pour votre aide d'hier.

j'ai fouillé un peu le serveur ou se trouve postgresql. donc quand je vais dans var/lib/pgsql/data et que j'ouvre PG_VERSION j'ai ceci 8.1 mais et c'est pour cela que je pensais être en 8.4  quand je fais opt/pgsql/postgresql-8.4.2 que j'ouvre le fichier INSTALL il y a la description pour installer postgres et cela correspond au dossier que j'ai mais ou finalement c'est postgres 8.1 qui tourne.
je ne sais pas trop ce qui c'est passé. La personne qui avait installer postgresql n'est plus la donc voila.

est ce possible de faire une mise à jour de postgres 8.1 vers 8.4 ? si oui est ce que je perdrai la base que j'ai crée?

merci d'avance

Dernière modification par chris0938 (01/04/2011 11:29:46)

Hors ligne

#19 01/04/2011 11:40:59

gleu
Administrateur

Re : requête récursive with

Il faut sauvegarder votre base et la restaurer après. Le mieux est de lire la doc : http://docs.postgresql.fr/8.4/install-upgrading.html


Guillaume.

Hors ligne

#20 05/04/2011 10:17:23

chris0938
Membre

Re : requête récursive with

bonjour,
j'ai suivie la doc pour mettre à jour la version de postgresql. donc a présent quand je vais dans /usr/local/pgsql/data et que j'ouvre PG_VERSION 8.4 est bien ecrit. Toutefois j'ai voulu vérifier pour être sur donc je me suis placé sur template1 et la j'ai fais un select version() voila ce qui en sort:

template1=# select version();
                                                 version
---------------------------------------------------------------------------------------------------------
 PostgreSQL 8.1.8 on x86_64-redhat-linux-gnu, compiled by GCC gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-3)
(1 row)

ensuite j'ai vais une show_directory

template1=# SHOW data_directory;
   data_directory
---------------------
 /var/lib/pgsql/data
(1 row)

comment cela se fait que postgres pointe sur ce dossier? est ce que c'est lors de la toute première installation que postgres a été mis ici? est ce qu'il ya un moyen de lui dire de "pointer" sur le dossier usr/local/pgsql/data? ou faut il que je refasse une mise a jour en prenant /var/lib/pgsql comme référence pour l'installation?

merci d'avance

Dernière modification par chris0938 (05/04/2011 10:27:50)

Hors ligne

#21 05/04/2011 10:32:02

Marc Cousin
Membre

Re : requête récursive with

Avez vous éteint l'ancienne instance ?
Sinon, elle est capable de fonctionner même si les fichiers ont été supprimés (merci unix). Vérifiez que vous n'avez pas encore des vieux processus postgres qui tournent.


Marc.

Hors ligne

#22 05/04/2011 10:45:26

chris0938
Membre

Re : requête récursive with

voila les processus:

ps -ef | grep postgres
root      9419  9085  0 09:37 pts/0    00:00:00 su postgres
postgres  9420  9419  0 09:37 pts/0    00:00:00 bash
root     10468 10444  0 Apr01 pts/3    00:00:00 su postgres
postgres 10469 10468  0 Apr01 pts/3    00:00:00 bash
postgres 10485 10469  0 Apr01 pts/3    00:00:00 psql uliss
postgres 19830     1  0 10:03 pts/0    00:00:00 /usr/bin/postmaster -D /var/lib/pgsql/data
postgres 19831 19830  0 10:03 pts/0    00:00:00 postgres: logger process
postgres 19833 19830  0 10:03 pts/0    00:00:00 postgres: writer process
postgres 19834 19830  0 10:03 pts/0    00:00:00 postgres: stats buffer process
postgres 19835 19834  0 10:03 pts/0    00:00:00 postgres: stats collector process
postgres 20414  9420  0 10:42 pts/0    00:00:00 ps -ef
postgres 20415  9420  0 10:42 pts/0    00:00:00 grep postgres

par contre je n'ai rien supprimé.
Aussi dans etc/init.d le fichier postgresql correspond a la version 8.1

Hors ligne

#23 05/04/2011 10:49:16

Marc Cousin
Membre

Re : requête récursive with

Apparemment il n'y en a qu'un seul qui tourne.

Que répond : «/usr/bin/postmaster --version» ?


Marc.

Hors ligne

#24 05/04/2011 10:51:09

chris0938
Membre

Re : requête récursive with

il répond ceci:

/usr/bin/postmaster --version
postmaster (PostgreSQL) 8.1.8

Hors ligne

#25 05/04/2011 10:55:27

Marc Cousin
Membre

Re : requête récursive with

Ok. Donc à l'heure actuelle c'est toujours la 8.1 qui fonctionne, puisque le programme en cours d'exécution est celui-ci. Et qu'il utilise l'instance se trouvant dans le répertoire /var/lib/pgsql/data.


Marc.

Hors ligne

Pied de page des forums