Pages: 1
- Sujet précédent - plus d'une ligne renvoyée par une sous-requête utilisée comme une expr - Sujet suivant
#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: 1554
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
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: 1554
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?
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
Pages: 1
- Sujet précédent - plus d'une ligne renvoyée par une sous-requête utilisée comme une expr - Sujet suivant