Vous n'êtes pas identifié(e).
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
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
À 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
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.
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
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
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
j'ai essayé de faire la requête avec with recursive en minuscule mais j'ai la même erreur.
Hors ligne
Pas très étonnant, la casse des caractères ne compte pas pour la syntaxe.
Guillaume.
Hors ligne
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
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
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
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
j'ai toujours la même erreur. pourtant j'ai fais un copier coller de votre requête.
Hors ligne
Ê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
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
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
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
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
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
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
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
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
Apparemment il n'y en a qu'un seul qui tourne.
Que répond : «/usr/bin/postmaster --version» ?
Marc.
Hors ligne
il répond ceci:
/usr/bin/postmaster --version
postmaster (PostgreSQL) 8.1.8
Hors ligne
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