Redondance

Tigosar -  
Ahmed402 Messages postés 21 Statut Membre -
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.
Configuration: Windows 2003
Firefox 3.5.7

11 réponses

  1. badri.abdelkader Messages postés 80 Statut Membre
     
    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
    1. tigosar Messages postés 29 Statut Membre 1
       
      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
  2. Tung Messages postés 212 Statut Membre 8
     
    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
  3. tigosar Messages postés 29 Statut Membre 1
     
    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
  4. badri.abdelkader Messages postés 80 Statut Membre
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Tung Messages postés 212 Statut Membre 8
     
    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
  7. Tung Messages postés 212 Statut Membre 8
     
    Petite question , est ce que ta marqué le champ client comme clé primaire ?
    0
  8. Tung Messages postés 212 Statut Membre 8
     
    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
  9. Ahmed402 Messages postés 21 Statut Membre 4
     
    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
    1. Tigosar
       
      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
  10. Ahmed402 Messages postés 21 Statut Membre 4
     
    quel SGBDR tu utilise?
    0
  11. Ahmed402 Messages postés 21 Statut Membre 4
     
    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
    1. Tigosar
       
      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
  12. Ahmed402 Messages postés 21 Statut Membre 4
     
    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