Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 29/08/2011, 13h20   #1
Inscrit
 
Inscription : mai 2004
Messages : 759
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 759
Points : 288
Points : 288
Par défaut Requête de suppression de doublons

Bonjour a tous
Après avoir répérer un ensemble de doublons je voudrais les supprimer mais en ajoutant un autre filtre du genre :
Code :
1
2
3
4
5
6
7
8
9
10
DELETE
FROM   MESINFORMATIONS T1
WHERE T1.LACLE < ANY (SELECT LACLE
                    FROM   MESINFORMATIONS T2
                    WHERE  T1.LACLE <> T2.LACLE
                      AND  T1.CHAMP1 = T2.CHAMP1
                      AND  T1.CHAMP2 = T2.CHAMP2
                      AND  T1.CHAMP3 = T2.CHAMP3
                      AND CHAMP4 >10 ) /* ajout d'un paramètre*/
Pour m'expliquer je cherche a détruire tous les doublons pour champ1, champ2, champ3 pour les lesquels champ4>10.
Est-ce la bonne syntaxe ?
Merci à tous.
devalender est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 13h34   #2
Membre éclairé
 
Avatar de boussafi
 
Homme
Ingénieur développement logiciels
Inscription : septembre 2007
Messages : 342
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : septembre 2007
Messages : 342
Points : 397
Points : 397
Envoyer un message via Yahoo à boussafi Envoyer un message via Skype™ à boussafi
il me semble que ta requete est correcte sauf que le ANY de quel SGBD est il?
boussafi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 14h02   #3
Inscrit
 
Inscription : mai 2004
Messages : 759
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 759
Points : 288
Points : 288
ok je vais tester voir alors sinon le Sgdb c'est Firebird 2.5 !
devalender est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 14h27   #4
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
Les prédicats ALL, ANY(SOME) font parties de la norme sql2.

Je ne sais pas trop ce que tu cherches à obtenir mais je pense que la condition champ4 > 10 devrait également être présente dans le WHERE du DELETE.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2011, 17h56   #5
Inscrit
 
Inscription : mai 2004
Messages : 759
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 759
Points : 288
Points : 288
Citation:
je ne sais pas trop ce que tu cherches à obtenir mais...
voici un peu une vue de mes données :
champ1-----champ2-----champ3------champ4
latif-----devalender-----12/12/2005-----5
latif-----devalender-----12/12/2005-----5
tatami-----jean-----21/12/2006------12
tatami-----jean-----21/12/2006------12
tatami-----jean-----21/12/2006------12
tatami-----jean-----21/12/2006------12

avec ce code :
Code :
1
2
3
4
5
6
7
8
9
 
SELECT champ1, champ2, champ3
FROM   MESINFORMATIONS T1
WHERE T1.LACLE < ANY (SELECT LACLE
               FROM   MESINFORMATIONS T2
               WHERE  T1.lacle <> T2.lacle
                 AND  T1.champ1 = T2.champ1
                 AND  T1.champ2 = T2.champ2
                 AND  T1.champ3 = T2.champ3)
je me retrouve avec 6 doublons, or avec ce code
Code :
1
2
3
4
5
6
7
8
9
10
 
DELETE
FROM   MESINFORMATIONS T1
WHERE T1.LACLE < ANY (SELECT LACLE
                    FROM   MESINFORMATIONS T2
                    WHERE  T1.LACLE <> T2.LACLE
                      AND  T1.CHAMP1 = T2.CHAMP1
                      AND  T1.CHAMP2 = T2.CHAMP2
                      AND  T1.CHAMP3 = T2.CHAMP3
                      AND CHAMP4 >10 ) /* ajout d'un paramètre*/
je voudrais qu'il me donne les doublons pour lesquels le champ4 >10 ce qui me reviendrait à détruire 4 tuples, comment puis je arriver à mes fins ?

Citation:
Envoyé par skuatamad Voir le message
je pense que la condition champ4 > 10 devrait également être présente dans le WHERE du DELETE.
ce que j'ai essayé de mettre ici :

Code :
1
2
3
4
5
6
7
8
9
10
DELETE
FROM   MESINFORMATIONS T1
WHERE champ4>10 AND T1.LACLE < ANY (SELECT LACLE
                    FROM   MESINFORMATIONS T2
                    WHERE  T1.LACLE <> T2.LACLE
                      AND  T1.CHAMP1 = T2.CHAMP1
                      AND  T1.CHAMP2 = T2.CHAMP2
                      AND  T1.CHAMP3 = T2.CHAMP3
                      AND CHAMP4 >10 ) /* ajout d'un paramètre*/
mais à ma grande surprise rien n'est supprimé

Merci
devalender est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2011, 09h04   #6
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 640
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 640
Points : 2 633
Points : 2 633
Bonjour,

Perso je passerais par une table temporaire (ou une vue)

d'abord la création de la vue :
Code :
1
2
3
4
5
6
7
 
CREATE VIEW v_temp AS (
SELECT max(id), champ1, champ2, champ3
FROM ma_table
WHERE champ4 > 10
GROUP BY champ1, champ2, champ3
HAVING count(*) > 1)
Ensuite la requête de delete :
Code :
1
2
3
 
DELETE FROM ma_table A
WHERE champ4 > 10 AND EXISTS (SELECT * FROM v_temp B WHERE a.id <> b.id AND a.champ1 = b.champ1 AND a.champ2 = b.champ2 AND a.champ3 = b.champ3)
J'ai pas testé le code mais l'idée est là.
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2011, 11h01   #7
Membre confirmé
 
Homme
Développeur informatique
Inscription : octobre 2006
Messages : 181
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2006
Messages : 181
Points : 267
Points : 267
Citation:
ce que j'ai essayé de mettre ici :


Code :Sélectionner tout - Visualiser dans une fenêtre à part12345678910
Code :
1
2
3
4
5
6
7
8
9
DELETE
FROM   MESINFORMATIONS T1
WHERE champ4>10 AND T1.LACLE < ANY (SELECT LACLE
                    FROM   MESINFORMATIONS T2
                    WHERE  T1.LACLE <> T2.LACLE
                      AND  T1.CHAMP1 = T2.CHAMP1
                      AND  T1.CHAMP2 = T2.CHAMP2
                      AND  T1.CHAMP3 = T2.CHAMP3
                      AND CHAMP4 >10 ) /* ajout d'un paramètre*/
mais à ma grande surprise rien n'est supprimé
Avez vous respecté la casse dans la vraie requete ? ( ici on a un champ4 et un CHAMP4 )
et bien "prefixé" le CHAMP4 de la sous-requete ?
Code :
1
2
3
T2.CHAMP4 >10 
ou
T2.CHAMP4 = T1.CHAMP4
Jean.Cri1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2011, 14h58   #8
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
Citation:
Envoyé par devalender Voir le message

je voudrais qu'il me donne les doublons pour lesquels le champ4 >10 ce qui me reviendrait à détruire 4 tuples, comment puis je arriver à mes fins ?
La requête citée ne peut pas effacer 4 tuples mais seulement 3. En effet celui-ci qui a le plus petite valeur de la colonne tacle ne peut pas être supprimé à cause de l'infériorité stricte ( < ANY).
Mais n'est-ce pas justement le but recherché?
En général quand on dédoublonne on ne veut pas tout effacer, on veut garder un seul exemplaire.

Citation:
ce que j'ai essayé de mettre ici :

Code :
1
2
3
4
5
6
7
8
9
10
DELETE
FROM   MESINFORMATIONS T1
WHERE champ4>10 AND T1.LACLE < ANY (SELECT LACLE
                    FROM   MESINFORMATIONS T2
                    WHERE  T1.LACLE <> T2.LACLE
                      AND  T1.CHAMP1 = T2.CHAMP1
                      AND  T1.CHAMP2 = T2.CHAMP2
                      AND  T1.CHAMP3 = T2.CHAMP3
                      AND CHAMP4 >10 ) /* ajout d'un paramètre*/
mais à ma grande surprise rien n'est supprimé
Avec le jeu d'essai mentionné, cette requête doit supprimer 3 tuples.
Si elle ne le fait pas c'est sans doute qu'il y a un problème dans les données.
Pour reproduire le problème il faudrait l'ordre CREATE TABLE et les INSERTs du jeu de données.
estofilo 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 14h39.


 
 
 
 
Partenaires

Hébergement Web