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

PostgreSQL Discussion :

Créer une nouvelle colonne avec résultat de sélection


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Architecte sys d'info géographique
    Inscrit en
    Juin 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Architecte sys d'info géographique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2011
    Messages : 64
    Par défaut Créer une nouvelle colonne avec résultat de sélection
    Bonjour, le résultat de la selection suivante (extension Postgis) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT a.id, b.iso3
    FROM "test.poi.barrest" a, "monde.admin.paystressimplifie" b
    WHERE a.geometry && b.geom
    AND ST_Intersects(a.geometry, b.geom)
    est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
           id        | iso3 
    ------------------+------
     way/401467207    | DZA
     node/482252337   | DZA
     node/508328276   | DZA
     way/745390942    | DZA
     way/1171619321   | DZA
     way/1171620274   | DZA
     way/1171624882   | DZA
    J'ai besoin d'inserer le résultat, comme une nouvelle colonne nommee iso3 dans test.poi.barrest

    Merci d'avance de votre aide.

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 601
    Billets dans le blog
    10
    Par défaut
    Bonjour,


    Depuis la norme SQL de 1992, les jointures ne se codent plus dans la restriction WHERE, mais avec l'opérateur JOIN.

    De plus, stocker une valeur calculée est une erreur : si la valeur d'un des opérandes change, la valeur calculée devient fausse.
    C'est pourquoi il faut calculer la valeur par requête à chaque fois que c'est nécessaire. Si le besoin est récurrent, créez une vue pour calculer cette valeur.

  3. #3
    Membre confirmé
    Homme Profil pro
    Architecte sys d'info géographique
    Inscrit en
    Juin 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Architecte sys d'info géographique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2011
    Messages : 64
    Par défaut
    Bonjour, je veux bien voir comment faire évoluer mon code, j'essaye d'apprendre Join mais je vois que j'ai malgré tout obtenu un résultat positif.

    Concernant cet enregistrement de la valeur à un instant T, et pas de manière dynamique, cela m'arrange.

    Ma base de données d'origine est dans tous les cas une copie, un snapshot d'une autre base de données qui a évolué depuis, et qui n'est plus à jour jusqu'au moment où je déciderai de créer une nouvelle copie (annuelle).

    Ma requête a pour but de qualifier : 'dans quel commune, dans quel quartier (avec un périmètre lourd en ressources calculé à chaque fois..) se situe tel point ?'

    A l'échelle d'une année, ce nom de commune ou de quartier n'a pas vocation à changer, d'où la non-nécessité d'avoir une base de données dynamique à cet endroit.

    J'essaye donc actuellement de comprendre les UPDATE et ALIAS pour tenter d'arriver à mes fins...

  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 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 059
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    De plus, stocker une valeur calculée est une erreur : si la valeur d'un des opérandes change, la valeur calculée devient fausse.
    C'est pourquoi il faut calculer la valeur par requête à chaque fois que c'est nécessaire. Si le besoin est récurrent, créez une vue pour calculer cette valeur.
    Ça, c'est la théorie, avec laquelle je suis habituellement d'accord .
    Mais dans la pratique, et surtout dès lors qu'on rentre dans des croisements avec de l'information spatiale, ce qui peut à la fois être volumineux et où les temps de traitements sont souvent longs, le recours à une requête systématique n'est pas toujours acceptable... Et dans ce cas, pour des raisons de performances des requêtes, il faut recourir au stockage de l'info issue du croisement.

    Citation Envoyé par vincedchart Voir le message
    Bonjour, je veux bien voir comment faire évoluer mon code, j'essaye d'apprendre Join mais je vois que j'ai malgré tout obtenu un résultat positif.
    Votre requête s'écrit comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT a.id, b.iso3
    FROM "test.poi.barrest" a
    INNER JOIN "monde.admin.paystressimplifie" b ON a.geometry && b.geom AND ST_Intersects(a.geometry, b.geom)
    Pour ce qui est de la création de la colonne dans la table test.poi.barrest :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE test.poi.barrest ADD COLUMN iso3 CHAR(3);
    Attention, sur votre exemple, la donnée ISO3 n'a que 3 caractères, mais peut-être existe-t-il des valeurs plus longue sur cette donnée (qu'on ne voit pas dans l'exemple). Il faudra donc adapter le type de la donnée iso3 à cette longueur maximale...

    Enfin, pour mettre à jour cette nouvelle colonne avec le résultat du croisement spatial, ça peut être fait comme ça par exemple (d'autres syntaxes sont possibles, mais je trouve celle-là plus compréhensible) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH croisement AS (
        SELECT a.id, b.iso3
        FROM "test.poi.barrest" a
        INNER JOIN "monde.admin.paystressimplifie" b ON a.geometry && b.geom AND ST_Intersects(a.geometry, b.geom)
    )
    UPDATE "test.poi.barrest" tpb
    SET iso3 = c.iso3
    FROM croisement c
    WHERE tpb.id = c.id;
    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
    Membre confirmé
    Homme Profil pro
    Architecte sys d'info géographique
    Inscrit en
    Juin 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Architecte sys d'info géographique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2011
    Messages : 64
    Par défaut
    Merci beaucoup. Effectivement je veux limiter le ponctionnement de ressources réseau. Ces deux codes sont intéressants et fonctionnent ! merci.

    Aucun souci pour CHAR3 ou varchar254 d'ailleurs, pour créer une colonne que je fais souvent.

  6. #6
    Membre confirmé
    Homme Profil pro
    Architecte sys d'info géographique
    Inscrit en
    Juin 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Architecte sys d'info géographique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2011
    Messages : 64
    Par défaut
    Je voudrais aller plus loin et dans l'exemple suivant, grâce à votre aide j'ai déterminé et enregistré dans la base de données, dans quelle commune se situe tel centre commercial.

    Il s'agit d'inserer pour centre commercial l'information du quartier dans lequel il se situe, étant donné que la division en quartiers n'est pas une science exacte mais une affaire de sensibilités, et ainsi un objet pourrait finalement être dans plusieurs quartiers s'il est à la limite, ou bien en même tempsdes microquartiers de voisinage et des quartiers à l'échelle plus large.

    J'aimerai plusieurs résultats dans la cellule, séparés par une virgule (les concaténer)

    voici un select qui a marché :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT a.name AS namecc, a.communes AS comm, b.name AS nameq FROM "idf.poi.ccial" a INNER JOIN "fr.local.osmquartiers" b ON ST_DWithin(a.geom,b.geom,0.006)
    ce qui donne des objets représentés par un rayon d'environ 1 km (mesuré par 0,006 degrés en mesure de la Terre).

    pourriez-vous me dire comment cumuler ces resultats avant de faire un update ?



    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
                   namecc                |         comm         |            nameq             
    -------------------------------------+----------------------+------------------------------
     Italie 2 (Printemps)                | Paris                | 13e Arrondissement
     Italie 2 (Printemps)                | Paris                | Butte aux Cailles
     Carrousel du Louvre (Printemps)     | Paris                | 1er Arrondissement
     Terre-Ciel (Carrefour)              | Chelles              | Villeneuve
     Les 3 Fontaines (Auchan)            | Cergy                | Cergy Préfecture
     Bobigny 2                           | Bobigny              | Cité Paul Vaillant Couturier
     Bobigny 2                           | Bobigny              | Cité Pablo Picasso
     Bobigny 2                           | Bobigny              | Cité Hector Berlioz
     Bobigny 2                           | Bobigny              | Cité Paul Éluard
     Westfield Forum des Halles          | Paris                | Les Halles
     Italie 2 (Printemps)                | Paris                | Les Gobelins
     Passy Plaza                         | Paris                | Passy
     Westfield Forum des Halles          | Paris                | Beaubourg
     Évry 2 (Carrefour)                  | Évry                 | Droits de l'Homme
     Évry 2 (Carrefour)                  | Évry                 | Le Canal
     Val d'Yerres 2 (Cora)               | Boussy Saint Antoine | Les Vingt Cinq Arpents
     Avenir (Carrefour)                  | Drancy               | Avenir Parisien
     Plein Air (E.Leclerc)               | Le Blanc Mesnil      | Cité Marcel Alizard
     Westfield Forum des Halles          | Paris                | Quartier des Halles
     Issy 3 Moulins (Auchan)             | Issy les Moulineaux  | Les Pucelles
     Issy 3 Moulins (Auchan)             | Issy les Moulineaux  | Les Brillants
     Westfield Les Quatre Temps (Auchan) | Puteaux              | La Défense
     CNIT (Fnac)                         | Puteaux              | La Défense
     Bay 1 Loisirs                       | Torcy                | Le Segrais
     Les 3 Fontaines (Auchan)            | Cergy                | Le Chemin de Cergy
     Les 3 Fontaines (Auchan)            | Cergy                | Les Clos Tripiers
     Les 3 Fontaines (Auchan)            | Cergy                | Les Arrangeons
     Les 3 Fontaines (Auchan)            | Cergy                | Vc Qua Nouvelle Prefecture
     Les 3 Fontaines (Auchan)            | Cergy                | Res des Bourgognes
     Les 3 Fontaines (Auchan)            | Cergy                | Les Bourgognes
     Les 3 Fontaines (Auchan)            | Cergy                | Les Marjoberts
     Les 3 Fontaines (Auchan)            | Cergy                | Les Maheux
     Les 3 Fontaines (Auchan)            | Cergy                | Les Plants Orange
     Les 3 Fontaines (Auchan)            | Cergy                | Les Plants Bruns
     Les 3 Fontaines (Auchan)            | Cergy                | Le Chemin Dupuis Brun
     Quai des Marques Franconville       | Franconville         | Bois de Saint-Marc
     Quai des Marques Franconville       | Franconville         | La Borne de Marbre
     St-Lazare Paris                     | Paris                | Quartier de l'Europe
     Westfield Les Quatre Temps (Auchan) | Puteaux              | La Défense 8
     CNIT (Fnac)                         | Puteaux              | La Défense 8
     Westfield Les Quatre Temps (Auchan) | Puteaux              | La Défense 6
     CNIT (Fnac)                         | Puteaux              | La Défense 6
     Charras                             | Courbevoie           | La Défense 5
     Westfield Les Quatre Temps (Auchan) | Puteaux              | La Défense 12
     CNIT (Fnac)                         | Puteaux              | La Défense 12
     CNIT (Fnac)                         | Puteaux              | La Défense 3
     Westfield Les Quatre Temps (Auchan) | Puteaux              | La Défense 4
     CNIT (Fnac)                         | Puteaux              | La Défense 4
     Charras                             | Courbevoie           | La Défense 2
     Westfield Les Quatre Temps (Auchan) | Puteaux              | La Défense 9
     CNIT (Fnac)                         | Puteaux              | La Défense 9
     Marques Avenue L'Île-Saint-Denis    | L'Île Saint Denis    | Vieux Saint-Ouen
     Charras                             | Courbevoie           | La Défense 1
     Thiais Village (Ikea)               | Thiais               | Green Valley
     Les Arcades (Carrefour)             | Noisy le Grand       | Maille-Horizon
     Beau Sevran (Carrefour)             | Sevran               | Les Beaudottes

  7. #7
    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 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 059
    Par défaut
    Pour le coup, je vous le déconseille. Si vous faites ça, vous enfreignez la première forme normale, avec plein de conséquences possibles en termes de performances et de recherches d'informations désastreuses.
    Par exemple, si vous concaténez les quartiers, comment faire une recherche efficace sur un quartier particulier ?

    ced
    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

  8. #8
    Membre confirmé
    Homme Profil pro
    Architecte sys d'info géographique
    Inscrit en
    Juin 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Architecte sys d'info géographique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2011
    Messages : 64
    Par défaut
    je n'avais pas encore prévu une selection postgresql définitive,

    mais je pense a quelque chose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * from "idf.poi.ccial" WHERE commune = 'Paris' AND quartier LIKE 'Butte aux Cailles'
    Like, ou contains...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 14/09/2018, 12h57
  2. [XL-2010] Mettre a Jour graphique avec une nouvelle colonne
    Par Floflo18 dans le forum Excel
    Réponses: 4
    Dernier message: 15/11/2017, 19h37
  3. Réponses: 1
    Dernier message: 10/05/2006, 15h01
  4. nouvelle colonne avec condition
    Par evaness dans le forum Access
    Réponses: 6
    Dernier message: 06/09/2005, 16h35
  5. Debutant SQL : Comment inserer une nouvelle colonne dans une
    Par cquadjul dans le forum Langage SQL
    Réponses: 3
    Dernier message: 26/07/2005, 21h34

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