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

Requêtes PostgreSQL Discussion :

Problème doublons PostGreSQL


Sujet :

Requêtes PostgreSQL

  1. #1
    Nouveau membre du Club
    Problème doublons PostGreSQL
    Bonjour,

    Je souhaite supprimer les doublons d'une table. J'utilise pgadmin 4 et c'est du postgre sql.
    Est-ce que quelqu'un aurait une syntaxe me permettant d'effectuer une suppression des doublons dans une table.

    Merci d'avance.

  2. #2
    Rédacteur

    Par nature le SQL étant ensembliste, il est impossible de supprimer des doublons, sans modifier la structure de la table afin d'introduire une colonne de dédoublonnage, par exemple avec un auto incrément.

    Commencez par modifier votre base et ensuite il vous sera possible de dédoublonner par exemple en utilisant le MAX de cette nouvelle colonne groupée par l'ensemble des autres colonnes, pour lequel le nombre d'élément est > 1 (HAVING COUNT(*) > 1)

    À me lire : https://sqlpro.developpez.com/cours/doublons/

    A +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  3. #3
    Nouveau membre du Club
    J'ai ajouté une colonne auto incrementé "idcol". J'essaie de supprimer les doublons avec cette fonction (trouvé sur le net), or j'ai une erreur de syntaxe sur ou près de « LEFT » d'après Pgadmin. Des solutions ?
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DELETE FROM defeme
    LEFT OUTER JOIN (
            SELECT MIN(idcol) as id, demand_iddema, copaip, nunati
            FROM defeme
            GROUP BY demand_iddema, copaip, nunati
        ) as t1 
        ON defeme.id = t1.id
    WHERE t1.id IS NULL

  4. #4
    Rédacteur

    La syntaxe SQL de PostGreSQL étant limitée, les jointures dans le delete ne sont pas supportées vous devez utiliser une syntaxe du genre :
    DELETE FROM MaTable
    WHERE EXISTS(...)

    A +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  5. #5
    Modérateur

    si ,avec USING.

    Du coup, si la table a un identifiant :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    with cte as (
      select  id, ROW_NUMBER() over(partition by a,b order by id)  as rn
      from LaTable
     )
     delete 
     from LaTable
     using cte
     where cte.id = LaTable.id
     and cte.rn > 1;

  6. #6
    Rédacteur

    J'avais oublié les "rewritable" CTE qui sont une épouvante, alors que la norme SQL permet l'écriture de requête UPDATE directement dans une CTE :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    with cte as (
      select  id, ROW_NUMBER() over(partition by a,b order by id)  as rn
      from LaTable
     )
     delete from LaTable
     where cte.id IN (SELECT id FROM cte WHER cte.rn > 1);


    Bizarre cette syntaxe hors norme de PostGreSQL alors que la norme est plus simple !

    A +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

###raw>template_hook.ano_emploi###