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 07/02/2013 12:01:32

doha-i2m
Membre

problème de requêtes imbriquées

Bonjour,
pg/sql n'accepte pas la requête imbriquée!!
ma requete me parait simple :

select the_geom  from (select cname from classofgeometry where eat='-') as c_name;

mais le message d'erreur affiché est : " ERREUR:  la colonne « the_geom » n'existe pas"!!!

Hors ligne

#2 07/02/2013 13:26:38

barthymus
Membre

Re : problème de requêtes imbriquées

Ben... dans ton from, tu as pas de colonnes the_geom donc... Essaye plutot :
select the_geom  from (select cname as the_geom from classofgeometry where eat='-') ;
Et encore, je suis pas fan des requete imbriqués donc je peux me tromper smile

Edit : Enfait, la requete veut strictement rien dire... je l'a laisse au cas ou mais je pense qu'elle est strictement fausse.
Peux tu expliquer plutot ce que tu souhaite faire avec cette requete imbriqué ?

Dernière modification par barthymus (07/02/2013 13:27:45)

Hors ligne

#3 08/02/2013 16:37:33

doha-i2m
Membre

Re : problème de requêtes imbriquées

Moi aussi je suis pas fan des requêtes imbriquées mais c ma seule solution. J'ai fait la sous-requête de la clause from  pour obtenir le nom de la table (classeofgeometry contient des noms de classes), le contexte de cette requête est un boucle "for" chaque classe de la table classofgeometry, on veut accéder à l'attribut "the_geom" de chaque table.(on veut parcourir tous les valeurs de "the_geom" de tous les tables de la bases).

voilà les 2 boucles (un boucle pour parcourir les noms de tables de la base et le 2ème pour parcourir les valeurs de l'attribut "the_geom" que chaque table en contient) :
for rec1 in select cname from classofgeometry where eat='-'
loop
select cname into c_name from classofgeometry where eat='-';
for rec2 in select the_geom from c_name
loop
...

on veut les rendre dans 1 seul boucle parce que le 2ème boucle de rec2 est fausse; c_name détécté du 1er curseur n'est pas un nom de table(pas accépté par le système). Donc la solution est la suivante:
for rec2 in select  the_geom from (select cname from classofgeometry where eat='-')as c_name
loop
....
je ne voit pas que cette requête est fausse, dans sql elle est accéptée, et même dans les tuto pg/sql; il est permis de faire un sous select au niveau de la clause from!

Hors ligne

#4 08/02/2013 22:18:31

rjuju
Administrateur

Re : problème de requêtes imbriquées

Bonjour,

si vous voulez parcourir toutes les valeur de "the_geom" de toutes les tables qui contiennent ce champ, l'utilisation de curseurs risque d'avoir de très mauvaises performances. Quelle est la finalité du traitement ?

Sinon, si vous voulez utiliser le nom d'une table dans votre boucle, il faut utiliser une requête dynamique. Exemple :

FOR c_name IN SELECT cname FROM classofgeometry WHERE eat = '-'
LOOP
  i := 1;
  FOR thegeom IN EXECUTE format('SELECT the_geom FROM %I',c_name)
  LOOP
    RAISE notice 'Table %, ligne % : %',c_name,i,thegeom;
    i := i+1;
  END LOOP;
END LOOP;

Dernière modification par rjuju (11/02/2013 12:06:28)

Hors ligne

#5 11/02/2013 11:37:24

doha-i2m
Membre

Re : problème de requêtes imbriquées

Bonjour,
merci rjuju mais  il y a une erreur de synthaxe dans votre exemple:
ERREUR:  erreur de syntaxe sur ou près de « ( » au niveau de la ligne "FOR thegeom IN SELECT EXECUTE format('SELECT the_geom FROM %I',c_name)"

"SELECT EXECUTE format" n'est pas accepté.

Hors ligne

#6 11/02/2013 12:05:57

rjuju
Administrateur

Re : problème de requêtes imbriquées

Exact, le SELECT devant le EXECUTE est en trop, j'édite l'exemple au dessus.

Hors ligne

#7 11/02/2013 12:55:57

doha-i2m
Membre

Re : problème de requêtes imbriquées

j'ai effacé la SELECT devant le EXECUTE , mais une autre erreur apparaissent hmm
ERREUR:  spécificateur de conversion « i » inconnu

je crois qu'il ne comprend pas que le "i" est la valeur de ième c_name !

(désolé si je vous ai bcq dérangé julien)

Hors ligne

#8 11/02/2013 13:14:21

rjuju
Administrateur

Re : problème de requêtes imbriquées

L'erreur semble plutôt provenir du format('SELECT the_geom FROM %I',c_name).


Avez-vous  bien mis le %I en majuscule ?

Hors ligne

#9 11/02/2013 13:24:18

doha-i2m
Membre

Re : problème de requêtes imbriquées

enfin l'exécution marche dans le bon chemin mais le sys cherche la table ayant le nom "(parc_the_geom)" avec les cotes et les parenthèses pas parc_the_geom directement! pourquoi?
ERREUR:  la relation « (parc_the_geom) » n'existe pas
LINE 1: SELECT the_geom FROM "(parc_the_geom)"
                                               ^

Hors ligne

#10 11/02/2013 13:33:26

rjuju
Administrateur

Re : problème de requêtes imbriquées

Je suppose que la table classofgeometry contient les enregistrements comme ça. Il faudrait voir d'où provient cette table, comment elle est remplie etc.

Hors ligne

#11 11/02/2013 16:31:28

doha-i2m
Membre

Re : problème de requêtes imbriquées

le problème n'est pas au niveau des enregistrements car ils sont insérés correctement. mais apparemment le type 'record' contient les valeurs avec des parenthèses :

begin
FOR c_name IN SELECT cname FROM classofgeometry WHERE eat = ''-''
LOOP 
  RAISE notice ''Table %'',c_name;
END LOOP;

affiche :NOTICE:  Table (parc_the_geom)
par contre si je met la valeur c_name dans une autre variable de type text:

FOR c_name IN SELECT cname FROM classofgeometry WHERE eat = ''-''
LOOP
   SELECT cname into name FROM classofgeometry WHERE eat = ''-'';
  RAISE notice ''Table %'',name;
END LOOP;

affiche: NOTICE:  Table parc_the_geom

Hors ligne

#12 11/02/2013 16:34:36

rjuju
Administrateur

Re : problème de requêtes imbriquées

Oui, la requête SELECT cname FROM classofgeometry WHERE eat = ''-'' renvoie un seul champ, il ne faut donc pas utiliser un type record pour la variable c_name.

Hors ligne

#13 11/02/2013 17:38:51

doha-i2m
Membre

Re : problème de requêtes imbriquées

Oui j'ai changé le type c_name au text et ça marche très bien smile
Merciii infiniment pour votre aide.

Hors ligne

Pied de page des forums