IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Duplication d'enregistrement avec sql


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2017
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2017
    Messages : 24
    Points : 11
    Points
    11
    Par défaut Duplication d'enregistrement avec sql
    Bonjour,

    J'ai la requête suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT  TC.ID_R, TC.ID_C, TIC.ID_I, TIC.* FROM TG_C TC 
    JOIN TLI_C TIC  ON TIC.ID_C = TC.ID_C 
    WHERE TC.ID_R = 1102939644
    qui me retourne le tableau suivant : sachant que j'ai fait une jointure entre la table TG_C et TIL_C.
    ------------------------------------------------------------------------------------------
    ID_R		         ID_C	       ID_I	                   ID_I	             ID_C	                
    -----------------------------------------------------------------------------------------
    1102939644	4768330	       20006904	           20006904	     4768330	
    1102939644	4768369	       20006955	           20006955	     4768369
    Maintenant sachant que ID_R n’est présent que sur la table TG_C que j’ai plus de 1400 ID_R dans ma table, je souhaite dupliquer les deux lignes en ajoutant chaque individu dans le contrat de l’autre. Cest-à-dire que j’aurai ceci au final :
    ------------------------------------------------------------------
    ID_R		ID_C	                          ID_I	      	nom
    ------------------------------------------------------------------
    1102939644	4768330	       	20006904	     	frank
    1102939644	4768369       	20006904	     	frank
    1102939644	4768369	       	20006955	     	laura
    1102939644	4768330	       	20006955	     	laura
    Merci pour vos réponses

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 806
    Points
    30 806
    Par défaut
    Citation Envoyé par cheikhnafall Voir le message
    je souhaite dupliquer les deux lignes en ajoutant chaque individu dans le contrat de l’autre.
    Où est l'individu ? Et le contrat ? D'où sort le nom ?
    Il manque quelques informations dans la description pour qu'on puisse commencer à analyser le problème...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2017
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2017
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    Où est l'individu ? L'individu se trouve dans la table TLI_C donc c'est la colonne nom
    Et le contrat ? le contrat se trouve dans la table TLI_C et TG_C donc la colonne ID_C
    D'où sort le nom ? le nom se trouve dans la table TLI_C

    Donc en gros je n'ai que id_c qui est présent dans les deux table

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 896
    Points
    38 896
    Billets dans le blog
    9
    Par défaut
    Bonjour

    Si je comprends bien, TG_C est la table des contrats et un contrat peut concerner plusieurs individus, les individus d'un contrat sont dans la table TLI_C ?
    Si c'est bien le cas, la solution dépend du nombre mini et maxi d'individus qu'il peut y avoir pour un contrat.

    Dans tous les cas, des alias plus parlants à la fois pour les tables et pour les colonnes nous éviteraient de faire des suppositions quant au contenu fonctionnel de chaque objet !
    Par exemple, la requête reformulée ainsi est autrement plus compréhensible (sous réserve que j'ai bien compris le rôle de chaque table et colonne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT  Contrat.ID_R         as ???
         ,  Contrat.ID_I         as ID_Individu
         ,  Contrat.ID_C         as ID_Contrat
         ,  Lien_Indv_Cont.ID_I  as ID_Individu
         ,  Lien_Indv_Cont.nom   as Nom_Individu 
         ,  Lien_Indv_Cont.ID_C  as ID_Contrat
    FROM  TG_C   Contrat 
    JOIN  TLI_C  Lien_Indv_Cont
      ON  Lien_Indv_Cont.ID_C = Contrat.ID_C 
    WHERE Contrat.ID_R = 1102939644
    Et aussi, SELECT [...] TIC.ID_I, TIC.* est aberrant, vous prenez deux fois la même colonne, sans compter que SELECT * est contre-performant et dangereux

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2017
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2017
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Merci pour vos supposition.

    En faite c'est un cas difficile à expliquer sur un forum.

    Merci à vous quand même.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2017
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2017
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    Bonjour, Je pense que cette fois ci je vais bien formuler ma question:
    J'ai ce tableau au debut et avec du sql je souhaite avoir le second tableau.
    ce qui veut dire que dans chaque dossier, s'il y'a deux individus qui sont sur deux contrats différents, je mets chacun d'eux sur l'autre contrat.
    Le résultat final doit ressembler au tableau 2.
    ----------------------------------------------------
    dossier Num_individu Num_contrat
    ----------------------------------------------------
    Dossier_1 1 C1
    Dossier_1 2 C2
    Dossier_2 3 C1
    Dossier_2 4 C2

    -----------------------------------------------------
    dossier Num_individu Num_contrat
    -----------------------------------------------------
    Dossier_1 1 C1
    Dossier_1 2 C2
    Dossier_1 1 C1
    Dossier_1 2 C2
    Dossier_2 3 C1
    Dossier_2 4 C2
    Dossier_2 3 C1
    Dossier_2 4 C2

  7. #7
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 840
    Points : 7 974
    Points
    7 974
    Par défaut
    Bonjour,

    Ne serait-ce pas plutôt un résultat du genre :

    dossier Num_individu Num_contrat
    -----------------------------------------------------
    Dossier_1 1 C1
    Dossier_1 2 C2
    Dossier_1 1 C2
    Dossier_1 2 C1
    Dossier_2 3 C1
    Dossier_2 4 C2
    Dossier_2 3 C2
    Dossier_2 4 C1

    avec cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Ta_table.dossier, 
                       Ta_table.Num_individu, 
                       Ta_table_1.Num_contrat
                       FROM Ta_table, Ta_table AS Ta_table_1 
                       WHERE Ta_table.dossier=Ta_Table_1.dossier;

    Cordialement.
    Mandresy
    "Je ne sais qu'une chose, c'est que je ne sais rien" Socrate

    N'oublions pas de mettre quand on a trouvé notre bonheur. Soyons sympa pour les futurs heureux.

    Merci, c'est toujours sympa de recevoir des de votre part

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 896
    Points
    38 896
    Billets dans le blog
    9
    Par défaut
    Ce qui avec une jointure normalisée s'écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select t1.dossier
         , t1.Num_individu 
         , t2.Num_contrat
    from tab1 T1
    inner join tab1 T2
       on T2.dossier=T1.dossier

  9. #9
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2017
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2017
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par madefemere Voir le message
    Bonjour,

    Ne serait-ce pas plutôt un résultat du genre :

    dossier Num_individu Num_contrat
    -----------------------------------------------------
    Dossier_1 1 C1
    Dossier_1 2 C2
    Dossier_1 1 C2
    Dossier_1 2 C1
    Dossier_2 3 C1
    Dossier_2 4 C2
    Dossier_2 3 C2
    Dossier_2 4 C1

    avec cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Ta_table.dossier, 
                       Ta_table.Num_individu, 
                       Ta_table_1.Num_contrat
                       FROM Ta_table, Ta_table AS Ta_table_1 
                       WHERE Ta_table.dossier=Ta_Table_1.dossier;

    Cordialement.
    Autant pour moi, je pense que t'as compris ce que je veux faire. Merci

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 896
    Points
    38 896
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par cheikhnafall Voir le message
    Le résultat final doit ressembler au tableau 2.
    -----------------------------------------------------
    dossier Num_individu Num_contrat
    -----------------------------------------------------
    Dossier_1 1 C1
    Dossier_1 2 C2
    Dossier_1 1 C1 <-- quel intérêt, c'est la même chose que la ligne 1 ?
    Dossier_1 2 C2 <-- quel intérêt, c'est la même chose que la ligne 2 ?
    Dossier_2 3 C1
    Dossier_2 4 C2
    Dossier_2 3 C1
    Dossier_2 4 C2
    Citation Envoyé par cheikhnafall Voir le message
    Autant pour moi, je pense que t'as compris ce que je veux faire. Merci
    Nous sommes au moins deux : j'avais compris la même chose que Madefemere.
    Pourquoi voulez vous restituer deux fois les mêmes lignes (cf. mes remarques ajoutées dans votre tableau 2)

  11. #11
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2017
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2017
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    Le résultat attendu est le suivant

    dossier Num_individu Num_contrat
    -----------------------------------------------------
    Dossier_1 1 C1
    Dossier_1 2 C2
    Dossier_1 1 C2
    Dossier_1 2 C1
    Dossier_2 3 C1
    Dossier_2 4 C2
    Dossier_2 3 C2
    Dossier_2 4 C1

    Le but est pour chaque dossier, relier les individus au deux contrats, par exemple:
    comme dans le tableau ci-dessus car actuellement dans cette table il y'a des dossier avec deux individus et deux contrat et que chaque individu est relié à un seul contrat hors les deux devraient être reliés au deux contrats

  12. #12
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 896
    Points
    38 896
    Billets dans le blog
    9
    Par défaut
    Du coup, vous confirmez par cette dernière réponse que ce que nous avons supposé madefemere et moi même était bien le résultat attendu
    Ce faisant, reprenez la solution proposée par madefemere (réponse n° 9) ou la mienne (réponse n° 10) qui est similaire mais plus "moderne" dans le sens où les jointures sont normalisées et vous obtiendrez le résultat attendu

  13. #13
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2017
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2017
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Merci pour vos réponses qui m'ont quant même données des idées sur ce cas très tordu.

    y'a il une fonction équivalente à IGNORE DUPLICATE dans sql server.

    Car aprés toutes mes manup j'ai cette erreur

    Violation of PRIMARY KEY constraint 'PK_TL_INDIVIDU_CONTRAT'. Cannot insert duplicate key in object 'dbo.TL_INDIVIDU_CONTRAT'. The duplicate key value is (1868834, 139992).

    Merci d'avance

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Il faut remplacer la requête INSERT par une requête MERGE.
    Attention, la syntaxe n'est pas du tout la même…

    Tatayo.

  15. #15
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    bonjour,

    Citation Envoyé par cheikhnafall Voir le message
    y'a il une fonction équivalente à IGNORE DUPLICATE dans sql server.
    Vous pouvez spécifier WITH (IGNORE_DUP_KEY = ON) sur une contrainte d'unicité.

    Personnellement, je préfère régler le problème en amont (MERGE comme indiqué par tatayo, ou autre) que d'utiliser cette option qui ignore silencieusement les lignes en doublon.

  16. #16
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2017
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2017
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    J'essaie de faire avec le MERGE j'arrive pas à l'adapter avec ma requête qui foire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    INSERT INTO TL_IND_CONTRAT (ID_CONTRAT,ID_INDIVIDU , ELT_ROLE, DAT_CRE, BOO_SIGNATAIRE, BOO_CONDAMNE )
    SELECT TTC.ID_CONTRAT , TTIC2.ID_INDIVIDU, TTIC1.ELT_ROLE, TTIC2.DAT_CRE, TTIC2.BOO_SIGNATAIRE, TTIC2.BOO_CONDAMNE
    FROM #tmp_TG_CONTRAT TTC INNER JOIN 
    #tmp_TL_IND_CONTRAT_FULL TTIC1 on TTIC1.ID_CONTRAT = TTC.ID_CONTRAT INNER JOIN 
    #tmp_TG_CONTRAT TTC1 on TTC.ID_RC = TTC1.ID_RC INNER JOIN    
    #tmp_TL_IND_CONTRAT_FULL TTIC2 on TTC1.ID_CONTRAT = TTIC2.ID_CONTRAT
    AND NOT EXISTS (SELECT * FROM TL_IND_CONTRAT TIC WHERE (TIC.ID_INDIVIDU=TTIC2.ID_INDIVIDU AND TIC.ID_CONTRAT=TTC.ID_CONTRAT))
    sachant que les deux clé id_contrat et id_individu sont des clés primaires

  17. #17
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Ce n'est pas une commande MERGE mais une commande d'insert à partir d'une requête. néanmoins elle devrait fonctionner, sauf si vous avez des doublons dans le résultat de la requête. Est-ce le cas ?

    en expliquant un peu votre contexte et ce que vous cherchez à faire, on pourrait mieux vous aider...

  18. #18
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2017
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2017
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    Effectivement j'ai des doublons dans le résultats de la requête et je souhaite les ignorer.

    Et je veux que lors de l'insertion du résultat du select, qu'il ignore les doublons.

  19. #19
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Si le problème vient de ce que la requête SELECT renvoie des lignes en double, un simple DISTINCT fera l'affaire.


    Tatayo.

  20. #20
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    s'il s'agit de doublons stricts, il suffit d'ajouter un DISTINCT.

    sinon, vous pouvez trouver sur le forum ce nombreux exemples pour dédoublonner des quasi doublons.

Discussions similaires

  1. [MySQL] Oubli d'un enregistrement requête sql avec mysql
    Par levasseur62 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 16/10/2011, 23h45
  2. [AC-2007] Créer un enregistrement avec des tables liées sur SQL Server
    Par NEfanda dans le forum Access
    Réponses: 2
    Dernier message: 29/04/2010, 19h31
  3. Verouiller un enregistrement avec linq to sql
    Par boby62423 dans le forum Linq
    Réponses: 10
    Dernier message: 29/04/2009, 13h34
  4. Réponses: 4
    Dernier message: 26/02/2008, 09h55
  5. [SQL] Duplication de lignes avec un ID différent
    Par neuropathie dans le forum Langage SQL
    Réponses: 4
    Dernier message: 19/12/2007, 15h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo