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 Thu 02 March 2017 15:36

Lucie D.
Participant actif
Date d'inscription: 21 Oct 2013
Messages: 137

Postgresql - ordre d'exécution d'un UPDATE

Bonjour,

Je dispose d'une couche bâtiments que je croise avec des parcelles cadastrales pour ramener les infos (=champs) de la parcelle au bâtiment.

Pour cela j'ajoute des champs vides dans ma couche bâti que je souhaite mettre à jour avec les données des parcelle là où le centroide du bâtiment intersecte la géométrie de ma parcelle.

Pour diverses raisons, certaines de ces parcelles se chevauchent et parfois le centroide d'un bâtiment est situé exactement sur ce chevauchement.
Comment fonctionne le UPDATE dans ce cas?

En effet, pour un bâtiment dont l'identifiant = id1 qui croise deux parcelles A et B, le UPDATE ne me ramène pas deux lignes :

id1 = A
id1 = B

mais bien soit l'un, soit l'autre.

Après plusieurs test distincts sur quelques parcelles concernées, je me rends compte que le update ramène à l'identifiant du bati la valeur du premier identifiant de la parcelle correspondant qui apparait dans la requête suivante :

Code:

select p.*
from parcelle as p,bati as b
where st_intersects(b.centroid,p.geom)

Or je ne comprends pas comment postgresql organise les données dans une table. Pourquoi positionne-t-il une ligne avant une autre (quand on ne fait pas d'order by sur tel ou tel champ bien évidemment)? Pouvez-vous confirmer mon hypothèse (phrase en gras)?

Je suis consciente que ma requête de mise à jour de mon bati à partir des parcelles n'est pas très juste mais j'aimerais simplement comprendre ce que fait le UPDATE quand il rencontre plusieurs valeurs possibles...?

En vous remerciant par avance.

Bien cordialement,

Lucie D.

Dernière modification par Lucie D. (Thu 02 March 2017 15:39)

Hors ligne

 

#2 Thu 02 March 2017 16:07

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1132

Re: Postgresql - ordre d'exécution d'un UPDATE

Salut,

extraits de la doc :
http://docs.postgresql.fr/9.6/sql-update.html

Notes

Lorsqu'une clause FROM est précisée, la table cible est jointe aux tables mentionnées dans liste_from, et chaque ligne en sortie de la jointure représente une opération de mise à jour pour la table cible. Lors de l'utilisation de FROM, il faut s'assurer que la jointure produit au plus une ligne en sortie par ligne à modifier. En d'autres termes, une ligne cible ne doit pas être jointe à plus d'une ligne des autres tables. Le cas échéant, seule une ligne de jointure est utilisée pour mettre à jour la ligne cible, mais il n'est pas possible de prédire laquelle.

À cause de ce manque de déterminisme, il est plus sûr de ne référencer les autres tables qu'à l'intérieur de sous-requêtes. Même si c'est plus difficile à lire et souvent plus lent que l'utilisation d'une jointure.


Mettre à jour les noms du contat dans la table comptes pour correspondre au vendeur actuellement affecté :

UPDATE comptes SET (prenom_compte, nom_compte) =
    (SELECT prenom, nom FROM vendeurs
     WHERE vendeurs.id = comptes.id_vendeur);

Un résultat similaire peut être obtenu avec une jointure :

UPDATE comptes SET prenom_contact = prenom,
                    nom_contact = nom
  FROM vendeurs WHERE vendeurs.id = comptes.id_vendeur;

Néanmoins, la deuxième requête pourrait donner des résultats inattendus si vendeurs.id n'est pas une clé unique alors que la première requête garantie la levée d'une erreur si plusieurs id correspondent. De plus, s'il n'y a pas de correspondance pour un certain comptes.id_vendeur, la première requête configurera les champs correspondants à NULL alors que la deuxième requête ne mettra pas du tout la ligne à jour.

Dernière modification par tumasgiu (Thu 02 March 2017 16:15)

Hors ligne

 

#3 Fri 03 March 2017 07:59

Lucie D.
Participant actif
Date d'inscription: 21 Oct 2013
Messages: 137

Re: Postgresql - ordre d'exécution d'un UPDATE

Bonjour!

Et bien nous y voilà, comme quoi, lire la doc postgresql est plus qu'utile avant de se lancer dans des tests plus farfelus les uns les autres... =P

Merci beaucoup, c'est exactement ce que je cherchais. Je savais que ma requête était "fausse" ou plutôt "aléatoire", mais je voulais la preuve "officielle" pour pouvoir passer à la suite et mettre en place une jointure qui ne me  renvoie bien au plus qu'"une seule ligne en sortie par ligne à modifier"!

Sujet résolu encore une fois! ;-)

Bonne journée.

Bien cordialement,

Lucie D.

Hors ligne

 

Pied de page des forums

Powered by FluxBB