1
votes

champ d'incrémentation automatique dans l'instruction de requête de sélection

J'ai une table avec 2 colonnes, nom et identifiant avec les valeurs suivantes

Nom Student_ID prise 231
dave 425
mike 001
lis 128
liam 358

Je voudrais ajouter une nouvelle colonne à ce résultat avec des valeurs de séquence incrémentées automatiquement.

J'ai essayé d'utiliser la requête ci-dessous. Mais j'obtiens une erreur comme décrit ci-dessous

Requête:

    Name  Student_ID  Serial
     jack      231      1    
     dave      425      2
     mike      001      3  
     lily      128      4 
     liam      358      5

Résultat attendu:

    SELECT @n := @n +1 n,
           name, 
           id
      FROM table1, (SELECT @n := 0) m
     ORDER BY id

    Error: 
    ERROR:  syntax error at or near ":="
    LINE 2: SELECT @n := @n +1 n,

p >


7 commentaires

Utilisez-vous vraiment Postgres? Ou utilisez-vous MySQL?


@TimBiegeleisen C'est Postgres, sinon ce ne serait pas une erreur de syntaxe si c'est MySQL. Peut-être qu'il utilise MySQL dans la vie passée


@MichaelBuen En fait, c'est aussi une erreur sur MySQL, car la table décrite par l'OP n'a pas de colonne id .


@TimBiegeleisen Hmm .. ne devrait-il pas être "champ id introuvable"? Pas une erreur de syntaxe?


C'est une erreur de syntaxe :-)


C'est champ id introuvable , pour être exact l'ID de colonne n'existe pas , pas une erreur de syntaxe. Je pensais que Posgtres devenait ridicule de signaler le champ manquant comme une erreur de syntaxe. J'ai donc essayé: db-fiddle.com/f/2LuQVjh4PEiHvUNNnspFDF/0


@TimBiegeleisen Je me suis concentré sur l'erreur de syntaxe, on peut en déduire que c'est MySQL s'il n'y a pas d'erreur de syntaxe, donc je ne méritais pas ça bien en fait tirania.org/blog/archive/2011/Feb-17.html


4 Réponses :


0
votes

essayez avec row_number()

SELECT row_number()over(order by id) n,
           name, 
           id
      FROM table1 
     ORDER BY id


0 commentaires

0
votes

utilisez row_number , cela fonctionne sur Postgres

select *, row_number() over(order by id) as serial from table1

Votre code @n: = @n + 1 est la solution de contournement de MySQL pour son manque de fonctions de fenêtrage (par exemple, row_number ) sur ses anciennes versions. Le dernier MySQL a maintenant des fonctions de fenêtrage. Vous pouvez simplement utiliser row_number , pas besoin de contournement.

Et vous n'avez même pas besoin de ce contournement dans Postgres. Il a des fonctions de fenêtrage bien avant presque tout le monde


0 commentaires

1
votes

utilisez row_number()

select name, student_id, row_number() over(order by student_id) as serial
from tablename


0 commentaires

0
votes

Votre code me semble être MySQL, pas du code Postgres. Votre erreur s'exécute sur Postgres, mais Postgres n'autorise généralement pas l'utilisation des variables utilisateur dans les requêtes SQL régulières. Lors de l'exécution de votre requête sur MySQL, j'obtiens une erreur indiquant que la colonne id n'existe pas.

Mais, dans tous les cas, Postgres a pris en charge la fonction analytique ROW_NUMBER pour depuis longtemps, alors utilisez-le à la place:

SELECT
    Name,
    Student_ID,
    ROW_NUMBER() OVER (ORDER BY Student_ID) Serial
FROM table1
ORDER BY
    Student_ID;


0 commentaires