Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/03/2011, 02h29   #1
jad
Invité de passage
 
Inscription : décembre 2005
Messages : 13
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 13
Points : 2
Points : 2
Par défaut Oracle sql : Mettre a jour que les doublons

Bjr,
Je désire mettre a jour un champ oracle (statut) que sur les doublons et sur les dates les moins recentes.

Code :
1
2
3
4
5
6
7
8
9
-tableA-
 
objet       date            statut
 
voiture     02/03/2011     2
voiture     02/02/2011     2
voiture     02/04/2011     2     
velo         02/04/2011     2    
velo         02/05/2011     2
afin d'obtenir

Code :
1
2
3
4
5
6
7
8
9
-tableA-
 
objet       date            statut
 
voiture     02/03/2011     3
voiture     02/02/2011     2
voiture     02/04/2011     3     
velo         02/04/2011     2    
velo         02/05/2011     3
1-
Je pense créer une table temporaire et copier les doublons les plus vieux avec leur rowid respectifs.
Code :
1
2
3
4
5
SELECT rowid FROM  tableA a  WHERE rowid > (
SELECT min(rowid)
FROM tableA b
WHERE b.objet= a.objet 
);
ou

Code :
1
2
3
4
5
SELECT * FROM tableA 
WHERE ROWID NOT IN ( 
SELECT max(ROWID)  
FROM tableA GROUP BY objet HAVING count(objet)>1
);
2-
puis mettre a jour le statut la table d'origine en recherchant par rowid


merci de vos réponses.
jad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2011, 04h49   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Citation:
Je désire mettre a jour un champ oracle (statut)
...
et sur les dates les moins recentes.
Quel est le formatage de la date 'dd/mm/yyyy' ou 'mm/dd/yyyy'
Mais bon indépendamment du formatage, l'exemple proposé semble mettre à jour toutes les dates SAUF les plus anciennes (donc si l'heure tardive ne me fourvoie pas ... les plus anciennes = les moins récentes) ... et comment passe t on de 2 à 3 (juste +1 ?)

La table temporaire me semble superflue, mais il serait bon d'apporter quelques precisions.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2011, 09h55   #3
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 925
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 925
Points : 4 547
Points : 4 547
la meilleure méthode que je connaisse est avec ROW_NUMBER et ROWID.

http://www.oracle.com/technetwork/is...om-097731.html

Code :
1
2
3
4
5
6
7
8
9
10
11
DELETE FROM tableA 
WHERE rowid IN
  ( SELECT rid
    FROM (
      SELECT rowid rid, 
         row_number() over 
         (partition BY obj ORDER BY dat DESC) rn  
      FROM tableA
    )
    WHERE rn > 1
 );
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/03/2011, 09h57   #4
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 925
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 925
Points : 4 547
Points : 4 547
pour update

Code :
1
2
3
4
5
6
7
8
9
10
11
UPDATE tableA SET STATUS='D'
WHERE rowid IN
  ( SELECT rid
    FROM (
      SELECT rowid rid, 
         row_number() over 
         (partition BY obj ORDER BY dat DESC) rn  
      FROM tableA
    )
    WHERE rn > 1
 );
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2011, 14h14   #5
jad
Invité de passage
 
Inscription : décembre 2005
Messages : 13
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 13
Points : 2
Points : 2
Par défaut cas doublon avec jointure

Bjr,

si je dois faire une dedoublonnage avec une jointure sur une autre table
cad tableb ou j'ai des identiants unique .

Code :
1
2
3
4
5
6
7
8
9
-tableB-
 
objet date statut
 
voiture 02/03/2011 2
voiture 02/02/2011 2
voiture 02/04/2011 2
velo 02/04/2011 2
velo 02/05/2011 2

je dois faire cela ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 UPDATE tableA SET STATUS='D'
WHERE rowid IN
  ( SELECT rid
    FROM (
      SELECT rowid rid, 
         row_number() over 
         (partition BY obj ORDER BY dat DESC) rn  
      FROM tableA,tableb
      WHERE a.obj=b.obj
    )
    WHERE rn > 1
 );
jad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2011, 14h17   #6
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 925
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 925
Points : 4 547
Points : 4 547
essaye de nous donner des CREATE TABLE et INSERT statements afin qu'on y voit plus clair...

MERCI
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h56.


 
 
 
 
Partenaires

Hébergement Web