1. #1
    Futur Membre du Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    décembre 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Transports

    Informations forums :
    Inscription : décembre 2011
    Messages : 11
    Points : 7
    Points
    7

    Par défaut Comment remplir un champ existant avec une numérotation automatique ?

    Bonjour,

    J'utilise habituellement row_number dans des requêtes de création de table mais là je souhaite mettre à jour un champ id déjà existant avec row_number.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    update schema1.table1 as a 
    set id=row_number () over ()
    me renvoie le message suivant :

    ERROR: window functions are not allowed in UPDATE
    LINE 1: update flux.metric_mobpro as a set id=row_number () over ()
    ^

    ********** Erreur **********

    ERROR: window functions are not allowed in UPDATE
    État SQL :42P20
    Caractère : 39



    Quelle syntaxe dois-je utiliser ?

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

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

    Informations forums :
    Inscription : avril 2002
    Messages : 5 596
    Points : 21 888
    Points
    21 888

    Par défaut

    Bonjour,

    Le message d'erreur a le mérite d'être explicite : les fonctions de fenêtrages ne sont pas directement utilisables dans un UPDATE.
    Néanmoins, vous devez pouvoir vous en sortir avec une CTE devant l'UPDATE et une jointure dans l'UPDATE sur cette CTE.

    Exemple :
    On crée une table test, contenant 2 colonnes dont la première est un entier généré aléatoirement et la seconde recevra le rang de cet entier par rapport aux autres entiers de la table (par mise à jour). On y insère 10 lignes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TEMPORARY TABLE test AS
    SELECT (100 * i * RANDOM())::INT AS col1, NULL::INT AS rang
    FROM generate_series(1,10) i;
    Contenu de la table test :
    col1 | rang
    -----------
      49 | 
     163 | 
     105 | 
       8 | 
     191 | 
     535 | 
     261 | 
     609 | 
     542 | 
     227 | 
    Maintenant, la requête de mise à jour de la colonne rang à l'aide d'une fonction de fenêtrage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WITH t0 AS (
    	SELECT col1, RANK() OVER(ORDER BY col1) AS rang
    	FROM test
    )
    UPDATE test t
    SET rang = t0.rang
    FROM t0
    WHERE t.col1 = t0.col1;
    Et le résultat obtenu :
    col1 | rang
    -----------
       8 | 1
      49 | 2
     105 | 3
     163 | 4
     191 | 5
     227 | 6
     261 | 7
     535 | 8
     542 | 9
     609 | 10
    À vous d'adapter cet exemple à votre cas de figure.

    @+
    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

Discussions similaires

  1. Remplir un champ Value avec une variable php
    Par Tanoak_LaCapuche dans le forum Syntaxe
    Réponses: 4
    Dernier message: 06/07/2012, 09h55
  2. Comment remplir des champs TEXTES avec des SESSIONS
    Par GoodWear dans le forum Débuter
    Réponses: 14
    Dernier message: 28/10/2009, 11h12
  3. [VBA] Comment valoriser un champ texte avec une variable ?
    Par Jean_Benoit dans le forum Access
    Réponses: 3
    Dernier message: 25/12/2006, 16h55
  4. Comment remplir les champs d'une autre application ?
    Par rico32fr dans le forum C++Builder
    Réponses: 6
    Dernier message: 19/06/2006, 09h54
  5. comment remplir 2 champs avec une seule listbox
    Par Didi17 dans le forum Access
    Réponses: 3
    Dernier message: 19/10/2005, 10h42

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