2010-10-04 28 views
2

J'utilise la base de données PostgreSQL. J'ai les données comme ci-dessous.Supprimer les lignes dupliquées en fonction de la condition

id  name1    name2   modified_date 
    - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
    40  Balfe   | Pat   | 2010-10-01 17:48:44.804823 
    41  Battigan  | David   |        
    42  Balfe   | Pat   | 2010-10-01 12:46:49.627593 
    44  Balfe   | Pat   | 2010-10-04 14:04:28.72415 
    45  Balfe   | Pat   | 
    46  Balfe   | Pat   | 2010-10-01 17:30:39.193153 
    47  Balfe   | Pat   |        

Je souhaite supprimer certaines lignes de la table. Les conditions à supprimer sont:

  1. Il supprimera les doublons avec modified_date = Null
    -> une copie des enregistrements en double ne doit pas être supprimé.
  2. Les enregistrements avec date de modification ne doivent pas être supprimés, bien qu'ils soient en double.

Dans le tableau ci-dessus, l'enregistrement avec id 47ou45 devraient être supprimés.

Répondre

4

Celui-ci devrait supprimer tous les enregistrements avec modified_date Is Null, où un autre enregistrement du même name1 et name2 existe, qui a également modified_date Is Null.

L'enregistrement avec le numéro le plus bas id ne sera pas supprimé.

Delete From your_table t1 
Where modified_date Is Null 
And Exists (Select 1 
      From your_table t2 
      Where t2.name1 = t1.name1 
       And t2.name2 = t2.name2 
       And t2.modified_date Is Null 
       And t2.id < t1.id 
      ) 
0

Hmm, quelque chose comme:

DELETE FROM tablename 
WHERE id NOT IN(SELECT DISTINCT id 
       FROM tablename 
       WHERE modified_date = Null) 

Je ne sais pas si PostgreSQL prend en charge les sous-requêtes avec une instruction IN cependant.

+0

Devrait être 'Is Null' au lieu de' = Null', mais alors il supprimerait tous les enregistrements où il est 'Null', sans garder un enregistrement ... –

+0

^Je suis un peu rouillé sur mon SQL . Merci d'avoir fait remarquer cela. –

Questions connexes