Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#1 Fri 01 February 2013 15:53

newsigiste
Participant occasionnel
Date d'inscription: 2 May 2012
Messages: 27

plus d'une ligne renvoyée par une sous-requête utilisée comme une expr

Bonjour

j'effectue une requête afin de créer une table contenant toutes les variables pour créer une carte en fonction des conditions environnementales.
Mais voilà postgreSQl me retourne toujours le même message d'erreur:

"plus d'une ligne renvoyée par une sous-requête utilisée comme une expression"

Je me suis rendu compte que ça fonctionnait bien jusqu'au variables "salinsur_x"

voici le script que j'utilise

Code:

DROP TABLE IF EXISTS terrain.variables2 CASCADE;

    CREATE TABLE terrain.variables2 AS
    SELECT g.idmaille,g.the_geom,
                (SELECT sm.codefacies FROM terrain.a1999_maj_facies_sedimentaire_folk AS sm WHERE g.idmaille=sm.idmaille) as facies_folk,
                (SELECT sl.facies FROM terrain.a1999_maj_facies_sedimentaire_larsonneur_shom AS sl WHERE g.idmaille=sl.idmaille) as facies_lesourd,
                (SELECT bm.cotemax FROM terrain.a1999_maj_bathymetrie AS bm WHERE g.idmaille=bm.idmaille) as profondeur_1999,
                (SELECT bm.drval1 FROM terrain.a2000_maj_bathymetrie_shom_l93 AS bm WHERE g.idmaille=bm.idmaille) as profondeur_min_2000,
                (SELECT bm.drval2 FROM terrain.a2000_maj_bathymetrie_shom_l93 AS bm WHERE g.idmaille=bm.idmaille) as profondeur_max_2000,
                (SELECT sam.salinite_moy FROM terrain.a1999_salinite_moy_surface_max AS sam WHERE g.idmaille=sam.idmaille)as salinite_moy_surf_max,
                (SELECT sam.salinite_moy FROM terrain.a1999_salinite_moy_surface_moy AS sam WHERE g.idmaille=sam.idmaille)as salinite_moy_surf_moy,
                (SELECT sam.salinite_moy FROM terrain.a1999_salinite_moy_surface_min AS sam WHERE g.idmaille=sam.idmaille)as salinite_moy_surf_min,
                (SELECT sam.salinite_moy FROM terrain.a1999_salinite_moy_fond_max AS sam WHERE g.idmaille=sam.idmaille)as salinite_moy_fond_max,
                (SELECT sam.salinite_moy FROM terrain.a1999_salinite_moy_fond_moy AS sam WHERE g.idmaille=sam.idmaille)as salinite_moy_fond_moy,
                (SELECT sam.salinite_moy FROM terrain.a1999_salinite_moy_fond_min AS sam WHERE g.idmaille=sam.idmaille)as salinite_moy_fond_min,
                (SELECT sap.salinsur_1 FROM terrain.inter_salinite_1_surf_pcent AS sap WHERE g.idmaille=sap.idmaille) as salinite_1_surf_pourcentage,
                (SELECT sap.salinsur_2 FROM terrain.inter_salinite_2_surf_pcent AS sap WHERE g.idmaille=sap.idmaille) as salinite_2_surf_pourcentage,
                (SELECT sap.salinsur_3 FROM terrain.inter_salinite_3_surf_pcent AS sap WHERE g.idmaille=sap.idmaille) as salinite_3_surf_pourcentage,
                (SELECT sap.salinsur_4 FROM terrain.inter_salinite_4_surf_pcent AS sap WHERE g.idmaille=sap.idmaille) as salinite_4_surf_pourcentage
FROM terrain.grille50m_test3 g;

    ALTER TABLE terrain.variables2
    ALTER COLUMN facies_folk TYPE text using facies_folk::text;

Si quelqu'un peu m'expliquer ce qu'il se passe?

Merci

Hors ligne

 

#2 Fri 01 February 2013 17:11

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1536

Re: plus d'une ligne renvoyée par une sous-requête utilisée comme une expr

Bonjour,

Oui: plus d'une ligne est renvoyée par le sous select wink
Plus sérieusement, les sous-select de votre clause select ne doivent renvoyer qu'une ligne chacun, histoire que la somme de ces sous-select produise une ligne de record a inserer dans la table.

Vérifiez la sous-requete en question de facon indépendante pour voir quelles sont les lignes renvoyées, et ajoutez au besoin une clause where pour filtrer ce sous-select.

Sinon, je vous invite a réécrire votre requete pour ne pas faire apparaitre tous ces sous-select, mais plutot joindre les tables de travail:

Code:

select g.idmaille,g.the_geom, sm.codefacies as facies_folk, ...
from terrain.grille50m_test3 g join terrain.a1999_maj_facies_sedimentaire_folk AS sm on (g.idmaille=sm.idmaille)
      join terrain.a1999_maj_facies_sedimentaire_larsonneur_shom AS sl on (g.idmaille=sl.idmaille)
   ...

Ca sera plus facile a maintenir, me semble-t-il.

Nicolas

Hors ligne

 

#3 Mon 04 February 2013 10:01

newsigiste
Participant occasionnel
Date d'inscription: 2 May 2012
Messages: 27

Re: plus d'une ligne renvoyée par une sous-requête utilisée comme une expr

merci,

J'ai testé mes sous-requêtes de façon indépendante mais le résultat était celui escompté.
J'ai donc opté pour votre réécriture (ça m'a pris pas mal de temps car ma requête est beaucoup plus longue que ce que j'ai mis), mais ça semble fonctionner.

Dernière modification par newsigiste (Mon 04 February 2013 10:02)

Hors ligne

 

#4 Mon 04 February 2013 13:53

newsigiste
Participant occasionnel
Date d'inscription: 2 May 2012
Messages: 27

Re: plus d'une ligne renvoyée par une sous-requête utilisée comme une expr

je reviens vers vous car même si je n'ai pas d'erreur pour l'instant avec le nouveau script, la requête n'a toujours pas pris fin alors qu'elle tourne depuis 3h maintenant.

Y aurait-il un moyen de rendre la requête plus rapide?

Hors ligne

 

#5 Mon 04 February 2013 14:40

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1536

Re: plus d'une ligne renvoyée par une sous-requête utilisée comme une expr

newsigiste a écrit:

je reviens vers vous car même si je n'ai pas d'erreur pour l'instant avec le nouveau script, la requête n'a toujours pas pris fin alors qu'elle tourne depuis 3h maintenant.

Y aurait-il un moyen de rendre la requête plus rapide?


Ca depend de bcp de facteurs:
Volumetrie des tables
index sur les champs concernés par les jointures
Vacuum des tables
matériel, conf de la base, etc.

Deja, y a-t-il des index sur tous les champs concernés par les jointures ?

Nicolas

Hors ligne

 

#6 Mon 04 February 2013 15:24

newsigiste
Participant occasionnel
Date d'inscription: 2 May 2012
Messages: 27

Re: plus d'une ligne renvoyée par une sous-requête utilisée comme une expr

alors il y a énormément de table qui sont utilisées dans cette requête (80)
J'ai des index sur tout les champs "idmaille" et si je ne me trompe pas c'est le seul champs sur lequel on fasse une jointure dans ce script ?

Hors ligne

 

Pied de page des forums

Powered by FluxBB