Redondance

Fermé
Tigosar - 17 févr. 2010 à 11:57
Ahmed402 Messages postés 21 Date d'inscription vendredi 13 mars 2009 Statut Membre Dernière intervention 16 avril 2010 - 23 févr. 2010 à 14:52
Bonjour,
J'ai un problème en sql et je veux connaitre la solution svp!Je travail avec windows server 2003

j'ai une table client c'est pour gérer les clients d'une entreprise qui c'est est comme ça: id_client, nom, prénom, adresse, tel ,email
chaque fois qu'un client vient je mets insert into clients values (1,' Chirac','Frank','45 Av Degaull ','00225469867','derklé@yahoo.fr')
Mon problème est que j'ai insèré les même clients plusieurs fois car ils passent et achètent plusieurs fois.Maintenant dans la table j'ai plus de 700 clients et certains se sont enregistrés 7fois,12fois,15fois........
je veux supprimer la répétition de ses clients.Comment est ce que je pourrais faire? aider moi svp.
Donnez moi un programme ou un script en SQL qui pourrait le supprimer.

11 réponses

badri.abdelkader Messages postés 67 Date d'inscription jeudi 11 février 2010 Statut Membre Dernière intervention 22 février 2010
18 févr. 2010 à 00:33
salut;
d'après mes connaissance le numéro séquentiel ne d'identifier les client . il faut avoir un champs qui permet de distinguer les client.
la solution est possible s'il y a un attribut qui permet de les distingué.
dans notre cas je croix que c'est le numéro de téléphone puisque les deux client ne peuvent pas avoir le même numéro de téléphone
cette solution et efficace si tu a enregistre pour chaque client son num_tel.

puisqu'on peut utiliser distinct dans une requete "select" pour selectionner le client une seule fois à la base de son numero de telphone meme s'il est repeter plusieur.

mais avant tous est ce que cette table est lié avec autre table par une clé étrangère?
et est ce que tout client est enregistré avec son num_tel chaque fois?

repond moi puis on reflechit a la methode de supression.

cordialement
A+
0
tigosar Messages postés 19 Date d'inscription mercredi 17 février 2010 Statut Membre Dernière intervention 3 mai 2016 1
18 févr. 2010 à 12:09
Salut , merci badri.abdelkader

Ma table n'est liée a aucune table par clé étrangère et le grand problème est que y'a certains clients que je n'ai pas leur num_tel .
En plus quelqu'un m'a dit qu'on peut créer une requête qui supprime exemple 5clients répétés pour en insérer un seul client.Et moi vraiment je ne comprend pas ce qu'il veut dire par là.
Si vous comprenez son raisonnement dites le moi svp!
merci!!
0
Tung Messages postés 187 Date d'inscription jeudi 7 février 2008 Statut Membre Dernière intervention 20 août 2013 8
18 févr. 2010 à 13:20
Salut
bon pas de panique je croix que le problème n'est pas assez compliqué.

j'ai crée une exemple pour votre cas ;

Client : équivalent à ta table client
#temp : une table tempo qui va recevoir les ligne distinct de la table Client

on va créer une procédure qu'on va nommer qui va récupérer les ligne distinct de la table client et qui seront mise en tempo dans la table #temp
puis seront insérées dans la table client après l'avoir vider

create proc Myp
as
create table #temp ( a int ) -----creation de la table temp
insert into #temp select distinct * from MaTable ---- insertion des ligne distinct
delete Client ------- vidange de la table Client
insert into Client select distinct * from #temp ---- remplissage de la table client par les ligne distincte
drop table #temp ----- supression et liberation des ressource de la table #temp

voilà, ta qu'a appliquer la même chose sur ta table client (id,nom,.......)

et vaudrai mieux demander au client si ils t ont deja visité ou pas comme ca t'aurai pas à exécuter la procédure a chaque bout de mois


TunGusk4
0
tigosar Messages postés 19 Date d'inscription mercredi 17 février 2010 Statut Membre Dernière intervention 3 mai 2016 1
18 févr. 2010 à 15:09
salut,
je vois ce que tu veux dire mais si je mets
insert into #temp select distinct * from MaTable
il peut sélectionner le même client nfois au cause de id_clientcar id_client que j'ai ici c'est de la forme 1, 2 ,3, 4, 5, etc ........... du fait que 1 est différent de 2 par exemple
si on a le même client en 1 et en 2 ,il va sélectionner le client en 1 et le client en 2.

merci
0
badri.abdelkader Messages postés 67 Date d'inscription jeudi 11 février 2010 Statut Membre Dernière intervention 22 février 2010
18 févr. 2010 à 18:26
salut tigosar;

j'ai pensé que le num_tel est capable de resoudre le problème mais malheuresement il n'est pas toujour figuré avec tous les enregistrement
tu doit consulter quelqu'un est professionnel en SQL et qui à beaucoup d'expérience pour t'aider
si non
tu peut exporté les client vers un fichier excel pour barrer les redendace à la main puis tu affecte les identifiants pour le reste
puis vider la table et ajouter une colonne pour l'identification et reinserer les données
700 client peut etre necessite une jouné de travail
moi je suis un débutant. je souhaite que tu resoudre le probleme rapidemnt.

je suis désolé .
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Tung Messages postés 187 Date d'inscription jeudi 7 février 2008 Statut Membre Dernière intervention 20 août 2013 8
19 févr. 2010 à 01:47
Haaa vraiment dsl j'ai pas fait attention à contrainte identity pour ID_client
donc je vais voir ce qu'il faut faire et je te répond après.

bonne chance
0
Tung Messages postés 187 Date d'inscription jeudi 7 février 2008 Statut Membre Dernière intervention 20 août 2013 8
19 févr. 2010 à 01:49
Petite question , est ce que ta marqué le champ client comme clé primaire ?
0
Tung Messages postés 187 Date d'inscription jeudi 7 février 2008 Statut Membre Dernière intervention 20 août 2013 8
19 févr. 2010 à 02:14
voila j ai fait quelque modification .

alter proc Myp
as
create table #temp ( nom VARCHAR (10), prenom VARCHAR (10), tel... ) -----creation de la table temp
insert into #temp select distinct nom,prénom , tel ,... from client ---- insertion des ligne distinct
delete Client ------- vidange de la table Client
insert into Client select distinct * from #temp ---- remplissage de la table client par les ligne distincte
drop table #temp ----- suppression et libération des ressource de la table #temp


Pour la procédure que tu va utiliser tu va créer la table #temp avec tous les champ sauf celui du numéro de client ( identity)
et bien sur lors du remplissage de la table client des nouvelles numéros sont inserer automatiquement , sauf que la numérotation va commencer par le total des client ( 700 pour votre cas )

créer une copie pour la base de donné avant d'essayer
bonne chance

By TM'DgL
0
Ahmed402 Messages postés 21 Date d'inscription vendredi 13 mars 2009 Statut Membre Dernière intervention 16 avril 2010 4
22 févr. 2010 à 02:07
tu doit maintenir cette contrainte et malheureusement tu px pas à chaque insertion réexecuter cet proc. Alors pourquoi pas executer cette proc pour la première fois afin d'arranger les choses en premier et puis il te faut un trigger c'est plus performant et plus rapide si ton SGBDR te le permet sinon ces galérant d'executer tel proc à chaque insertion.

-Cordialement-
0
sly Ahmed402,
Est ce que tu a l'idée sur le trigger que je pourrais mettre en place pour résoudre mon problème?
s'il te plait.
0
Ahmed402 Messages postés 21 Date d'inscription vendredi 13 mars 2009 Statut Membre Dernière intervention 16 avril 2010 4
22 févr. 2010 à 14:31
quel SGBDR tu utilise?
0
Ahmed402 Messages postés 21 Date d'inscription vendredi 13 mars 2009 Statut Membre Dernière intervention 16 avril 2010 4
22 févr. 2010 à 14:41
quel SGBDR tu utilise?

si c SQL Server
tu as recours au trigger instead of

create trigger TinsertClient on clients
instead of insert
as
declare cur cursor for select * from inserted
declare @nom varchar(30),@prenom varchar(30),@adresse varchar(50),@tel varchar(20),@mail varchar(30)
open cur
fetch cur into @nom,@prenom,@adresse,@tel,@mail
while @@fetch_status=0
begin
if not exists(select * from clients where nom like @nom and prenom like @prenom and adresse like @adresse and tel like @tel and mail like @mail)
insert into clients values (@nom,@prenom,@adresse,@tel,@mail)
fetch cur into @nom,@prenom,@adresse,@tel,@mail
end
close cur
deallocate cur
0
salut Ahmed402,
Merci por le programme mais je l'ai essayé et il affiche une erreur comme celle la:
Serveur : Msg 137, Niveau 15, État 2, Procédure TinsertClient, Ligne 8
La variable '@@fetch_satus' doit être déclarée.
Serveur : Msg 170, Niveau 15, État 1, Procédure TinsertClient, Ligne 26


Ligne 26 : syntaxe incorrecte vers 'cur'.
et je comprends pas ou se trouve le problème.
0
Ahmed402 Messages postés 21 Date d'inscription vendredi 13 mars 2009 Statut Membre Dernière intervention 16 avril 2010 4
23 févr. 2010 à 14:52
Je corrige !

alter trigger TinsertClient on clients
instead of insert
as
declare cur cursor for select nom,prenom,adresse,tel,mail from inserted
declare @nom varchar(30),@prenom varchar(30),@adresse varchar(50),@tel varchar(20),@mail varchar(30)
open cur
fetch cur into @nom,@prenom,@adresse,@tel,@mail
while @@fetch_status=0
begin
if not exists(select * from clients where nom like @nom and prenom like @prenom and adresse like @adresse and tel like @tel and mail like @mail)
insert into clients values (@nom,@prenom,@adresse,@tel,@mail)
fetch cur into @nom,@prenom,@adresse,@tel,@mail
end
close cur
deallocate cur

n'oublie pas de marqué "résolu" ;)
0