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
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2019
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2019
    Messages : 32
    Points : 17
    Points
    17
    Par défaut 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
    Avatar de SQLpro
    Homme Profil pro
    YYYY
    Inscrit en
    mai 2002
    Messages
    19 231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : YYYY
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 19 231
    Points : 45 458
    Points
    45 458
    Par défaut
    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 +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2019
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2019
    Messages : 32
    Points : 17
    Points
    17
    Par défaut
    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
    Avatar de SQLpro
    Homme Profil pro
    YYYY
    Inscrit en
    mai 2002
    Messages
    19 231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : YYYY
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 19 231
    Points : 45 458
    Points
    45 458
    Par défaut
    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 +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    janvier 2010
    Messages
    5 314
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : janvier 2010
    Messages : 5 314
    Points : 12 120
    Points
    12 120
    Par défaut
    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
    Avatar de SQLpro
    Homme Profil pro
    YYYY
    Inscrit en
    mai 2002
    Messages
    19 231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : YYYY
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 19 231
    Points : 45 458
    Points
    45 458
    Par défaut
    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 +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

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

Discussions similaires

  1. Problèmes : Doublons + Maximum
    Par matybouch dans le forum Deski
    Réponses: 3
    Dernier message: 18/01/2008, 17h16
  2. Réponses: 4
    Dernier message: 31/05/2007, 15h33
  3. problème installation postgresql sous linux debian
    Par pimousse3000 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 14/12/2006, 14h08
  4. problème doublons clause WHERE
    Par bastoonet dans le forum Designer
    Réponses: 16
    Dernier message: 20/10/2006, 16h41
  5. Problème doublon zone liste
    Par hervay dans le forum Access
    Réponses: 15
    Dernier message: 02/06/2006, 10h41

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