IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 :

Jointure spatiale dans un UPDATE


Sujet :

Requêtes PostgreSQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2017
    Messages : 21
    Points : 5
    Points
    5
    Par défaut Jointure spatiale dans un UPDATE
    Les amis ça fait une semaine que je galère avec cette requête, j'aimerais modifier modifier les valeurs du champ "reference" de la table "pbo" selon les valeurs de plusieurs champs qui sont dans la même table et un autre champ qui est dans la table "cable" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE pbo  SET reference = 'OFMC'
    FROM pbo  JOIN cable ON ST_Intersects(pbo.geom, cable.geom)
    WHERE ((interco = 'Fenetrage' OR interco = 'Extremite') AND
    support = 'CHAMBRE' AND fa_fs < 9 AND fonction = 'PBO'
    AND cable.capacite < 97)
    Le problème c'est que j'ai un autre champ d'une troisième table qui rentre dans l’équation, je ne sais pas comment faire la jointure spatiale de 3 tables à la fois, mais bon si je réussi à exécuter cette requête c'est déjà ça.

    Je vous remercie par avance

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Pourquoi mettez-vous la table pbo dans la clause FROM, alors que c'est la table sur laquelle est faite la mise à jour ?
    L'idée, c'est de faire la jointure, si possible, entre votre table cable et la troisième table (dont on ne connaît ni le nom, ni le lien avec les deux autres tables, ce qui limite les possibilités pour pouvoir vous aider...) dans la clause FROM, et de migrer votre jointure spatiale ST_Intersects(pbo.geom, cable.geom) dans la clause WHERE de l'UPDATE.

    Sinon, il faudra passer par une requête WITH, ou bien par une sous-requête...

    Mais encore une fois, sans le schéma de vos tables et les liens entre elles, on ne peut pas dire grand chose de plus.
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2017
    Messages : 21
    Points : 5
    Points
    5
    Par défaut
    Maintenant j'ai une autre erreur, "les fonctions d'agrégats ne sont pas autorisées dans le WHERE"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    update sro_dxc.pbo  set reference = 'OFMC' from sro_dxc.cable where ST_Intersects(pbo.geom, cable.geom) AND (interco = 'Fenetrage' OR interco = 'Extremite') AND
    support = 'CHAMBRE' AND fa_fs < 9 AND fonction = 'PBO' AND max(cable.capacite) < 97

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Et si vous nous donniez le schéma de vos tables et nous expliquiez un peu mieux ce que vous voulez faire...
    Parce que là, sans un schéma clair et un exemple des données en jeu et à mettre à jour, c'est compliqué de pouvoir vous aider efficacement...
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2017
    Messages : 21
    Points : 5
    Points
    5
    Par défaut
    Je cherche à remplir le champ "reference" de la table "pbo", la valeur de ce champ dépend de la valeur du champ "capacite" de la table "cable" qui contient des entiers. Les deux tables n'ont pas de champs en commun, elles sont liées spatialement c'est pour ça je fais la jointure avec St_Intersects. la table "cable" représente des lignes, et la table "pbo" représente des points, quand je fais la jointure, je me retrouve par exemple avec un point (pbo) qui s'intersecte avec plusieurs lignes (cables), donc je dois aller chercher la valeur du champ "capacite" de tous les cables qui s'intersecte avec ce point et voir si la plus grande valeur dépasse un certain seuil pour ensuite déterminer quel valeur attribuer à mon champ "reference" de mon point (pbo).
    Nom : pbo.JPG
Affichages : 690
Taille : 307,1 KoNom : cable.JPG
Affichages : 678
Taille : 270,0 KoNom : shéma.JPG
Affichages : 654
Taille : 22,4 Ko

  6. #6
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Et quelle est la règle pour remplir "reference" à partir de "capacite" ?
    Vous essayez de comparer à une somme... Pourquoi ?
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2017
    Messages : 21
    Points : 5
    Points
    5
    Par défaut
    comme je viens de vous le dire, si la capacite maximum de tous les cables qui s'intersecte avec le pbo est inférieur à 97 le champ reference doit contenir la valeur OMFC, c'est un exemple, il y a plusieurs cas à traiter, si c'est inférieur à 145 la reference change et ainsi de suite.

  8. #8
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Au temps pour moi, je n'avais pas bien lu le dernier message.
    Le mieux, c'est encore de passer par une CTE, du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    WITH croise AS (
        SELECT p.gid, MAX(c.capacite) AS maxi
        FROM pbo p
        INNER JOIN cable c ON ST_Intersects(p.geom, c.geom)
        GROUP BY p.gid
    )
    UPDATE pbo
    SET reference = 
        CASE
             WHEN maxi < 97 THEN  'OFMC'
             WHEN ... -- traiter les autres cas de figure de la même manière
        END
    FROM croise
    WHERE pbo.gid = croise.gid
    AND -- ajouter ici des conditions supplémentaires sur les lignes de pbo à mettre à jour si besoin
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2017
    Messages : 21
    Points : 5
    Points
    5
    Par défaut
    Je vous remercie beaucoup, cela marche très bien.

  10. #10
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2017
    Messages : 21
    Points : 5
    Points
    5
    Par défaut
    Après comparaison avec un table de vérification, ça donne pas le bon résultat ... mais là je pense que je suis proche de la bonne requête, je vais continuer de regarder ça, merci quand même

Discussions similaires

  1. Jointure dans un UPDATE
    Par CinePhil dans le forum SQL
    Réponses: 4
    Dernier message: 30/01/2012, 22h01
  2. [Oracle] Faire des jointures dans un update
    Par romaintaz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 10/06/2009, 16h01
  3. Jointure dans un update
    Par xian21 dans le forum Requêtes
    Réponses: 3
    Dernier message: 16/12/2008, 16h46
  4. Problème dans un UPDATE avec jointure
    Par seblem dans le forum Langage SQL
    Réponses: 1
    Dernier message: 05/03/2008, 11h26
  5. GROUP BY et HAVING dans un UPDATE
    Par MashiMaro dans le forum Langage SQL
    Réponses: 3
    Dernier message: 26/08/2003, 08h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo