Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

ERREUR: plus d'une ligne renvoyée par une sous-requête


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre habitué
    ERREUR: plus d'une ligne renvoyée par une sous-requête
    Bonjour à tous,
    je cherche à faire un update sur un champ suivant une jointure spatiale.
    J'ai une table adresse avec le champ localpoint qui est renseigné soit par BATIMENT ou PARCELLE
    j'ai une table batiment qui concerne la parcelle.

    Je cherche tous les adresses qui sont sur un batiment avec la fonction ST_INTERSECTS et ensuite je fais l'update. Mais ça me retourne l'erreur

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    ERROR:  ERREUR:  plus d'une ligne renvoyée par une sous-requête utilisée comme une expression
    État SQL : 21000


    Voici la requête :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE bal.adresse SET localpoint = 'BATIMENT' WHERE id_adresse = (
    select distinct adresse.id_adresse
    from bal.adresse left join bd_parcellaire.batiment ON ST_Intersects(batiment.geom, adresse.geom)
    WHERE batiment.id is not null ORDER BY adresse.id_adresse);


    Si quelqu'un a une idée, Merci ?

  2. #2
    Modérateur

    Plusieurs anomalies dans cette requête :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    UPDATE  bal.adresse 
    SET     localpoint = 'BATIMENT' 
    WHERE   id_adresse IN -- Si la sous-requête retourne plusieurs lignes, il faut faire une recherche sur l'ensemble des valeurs retournées
            (   SELECT  /*  DISTINCT */ adresse.id_adresse  --  DISTINCT est inutile
                FROM    bal.adresse 
                    INNER JOIN  --  Avec un jointure externe, toutes les lignes de bal.adresse seraient retournées
                        bd_parcellaire.batiment 
                        ON  ST_Intersects(batiment.geom, adresse.geom)
                --  WHERE batiment.id is not null   --  Si la condition est là pour conterdire la jointure externe, autant utiliser une jointure interne  
                --  ORDER BY adresse.id_adresse     --  La clause ORDER BY est inopérante dans une sous-requête
            )
    ;
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  3. #3
    Modérateur

    J'aurai même exécuté cette requête :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    update bal.adresse 
       set localpoint = 'BATIMENT' 
     where exists (select null
                     from bd_parcellaire.batiment
                    where ST_Intersects(batiment.geom, adresse.geom));

  4. #4
    Membre habitué
    Nikel ça fonctionne je vous remercie

###raw>template_hook.ano_emploi###