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

  1. #1
    Futur Membre du Club
    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
    Rédacteur/Modérateur

    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 :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    SELECT *
    FROM 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 :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    SELECT *
    FROM test;

    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