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

Développement SQL Server Discussion :

Insertion données d'une table d'une bdd vers une autre table d'une autre bdd


Sujet :

Développement SQL Server

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Septembre 2016
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Insertion données d'une table d'une bdd vers une autre table d'une autre bdd
    Bonjour,

    Pourriez-vous m'aider svp car j'ai un message d'erreur sur ma requête étant censée répondre à la demande suivante :

    J'ai une base de données "1". Je dois récupérer l'intégralité des données de la table "RETENUESALAIRE" de cette bdd.
    Je dois les copier sur une base de données "2", dans la même table "RETENUESALAIRE". Il existe déjà des données dans cette table auxquelles je ne veux pas toucher. Donc il se peut que des données identiques se trouvent dans la table cible mais je ne veux surtout pas faire d'update.

    Voici la requête que j'ai effectué :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    insert into DISTRITEC2.dbo.RETENUESALAIRE 
    (DISTRITEC2.dbo.PRE_SALARIE,DISTRITEC2.dbo.PRE_ORDRE,DISTRITEC2.dbo.PRE_LIBELLE,DISTRITEC2.dbo.PRE_DATEDEBUT,DISTRITEC2.dbo.PRE_DATEFIN,
    DISTRITEC2.dbo.PRE_MONTANTMENS,DISTRITEC2.dbo.PRE_MONTANTTOT,DISTRITEC2.dbo.PRE_NBMOIS,DISTRITEC2.dbo.PRE_nbjours,DISTRITEC2.dbo.PRE_SOLDE,
    DISTRITEC2.dbo.PRE_ACTIF,DISTRITEC2.dbo.PRE_RIB,DISTRITEC2.dbo.PRE_RETENUESAL,DISTRITEC2.dbo.PRE_TYPEPAIERET,DISTRITEC2.dbo.PRE_RUBRIQUE,
    DISTRITEC2.dbo.PRE_BENEFICIAIRERS,DISTRITEC2.dbo.PRE_NIVEAURS,DISTRITEC2.dbo.PRE_DATECREATION,DISTRITEC2.dbo.PRE_DATEMODIF,
    DISTRITEC2.dbo.PRE_CREATEUR,DISTRITEC2.dbo.PRE_CLOTURE,DISTRITEC2.dbo.PRE_REMBMAX,DISTRITEC2.dbo.PRE_CALCFRACTION,
    DISTRITEC2.dbo.PRE_REMBEFFECTUE,DISTRITEC2.dbo.PRE_ECHEANCIER,DISTRITEC2.dbo.PRE_BENEFRSGU,DISTRITEC2.dbo.PRE_NONLIMITE10P)
     
    select rtsource.PRE_SALARIE,rtsource.PRE_ORDRE,rtsource.PRE_LIBELLE,rtsource.PRE_DATEDEBUT,rtsource.PRE_DATEFIN,rtsource.PRE_MONTANTMENS,
    rtsource.PRE_MONTANTTOT,rtsource.PRE_NBMOIS,rtsource.PRE_nbjours,rtsource.PRE_SOLDE,rtsource.PRE_ACTIF,rtsource.PRE_RIB,rtsource.PRE_RETENUESAL,
    rtsource.PRE_TYPEPAIERET,rtsource.PRE_RUBRIQUE,rtsource.PRE_BENEFICIAIRERS,rtsource.PRE_NIVEAURS,rtsource.PRE_DATECREATION,rtsource.PRE_DATEMODIF,
    rtsource.PRE_CREATEUR,rtsource.PRE_CLOTURE,rtsource.PRE_REMBMAX,rtsource.PRE_CALCFRACTION,rtsource.PRE_REMBEFFECTUE,rtsource.PRE_ECHEANCIER,
    rtsource.PRE_BENEFRSGU,rtsource.PRE_NONLIMITE10P
     
    from DISTRITEC.dbo.RETENUESALAIRE as rtsource inner join DISTRITEC2.dbo.RETENUESALAIRE as rttarget on (rtsource.PRE_SALARIE<>rttarget.PRE_SALARIE and rtsource.PRE_ORDRE<>rttarget.PRE_ORDRE)
    Et voici le message d'erreur que je reçois :

    Msg*2601, Niveau*14, État*1, Ligne*1
    Impossible d'insérer une ligne de clé en double dans l'objet «*dbo.RETENUESALAIRE*» avec un index unique «*PRE_CLE1*». Valeur de clé dupliquée*: (0000000018, 1).

    Qu'ai-je oublié ou mal fait ?

    Je vous remercie par avance.

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Il existe déjà des données dans cette table auxquelles je ne veux pas toucher. Donc il se peut que des données identiques se trouvent dans la table cible mais je ne veux surtout pas faire d'update.
    Il vous faut donc réaliser une demi-jointure : on vérifie ainsi simplement que les lignes de la table cible n'ont pas de valeur correspondante dans la table source.
    Voici un petit exemple très simple pour vous aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    DECLARE @table_source TABLE
    (
    	i tinyint
    )
     
    INSERT INTO @table_source VALUES (1), (2), (3)
     
    DECLARE @table_cible TABLE
    (
    	i tinyint
    )
     
    INSERT INTO @table_cible VALUES (0), (2), (4)
     
    SELECT		C.i
    		, S.i
    FROM		@table_source AS S
    LEFT JOIN	@table_cible AS C
    			ON S.i = C.i
     
    INSERT INTO	@table_cible (i)
    SELECT		S.i
    FROM		@table_source AS S
    LEFT JOIN	@table_cible AS C
    			ON S.i = C.i
    WHERE		C.i IS NULL
     
    SELECT	*
    FROM	@table_cible
    Vous pouvez changer le type de jointure dans le premier SELECT pour bien comprendre l'effet de chaque type de jointure externe (RIGHT, LEFT, FULL).
    En applicant la logique de cet exemple à votre requête, vous obtiendrez le résultat escompté.

    Dans votre code, évitez les prédicats "négatifs", comme "n'est pas égal à (<>)", car l'optimiseur connaît la répartition des valeurs dans les colonnes.
    Mais il ne peut pas connaître la répartition des valeurs qui n'y sont pas. Or il se base sur cette information pour exécuter la requête de façon efficace.
    En l'absence de cette information, il bascule sur une optimisation par défaut, qui peut être néfaste aux performances de vos requêtes.

    Pour visualiser la logique de tous les types de jointures, vous pouvez vous aider de ce poster.
    Pour étendre votre connaissance sur ce sujet (incontournable quand on manipule des bases de données SQL), je vous conseille de lire l'article de SQLPro sur ce sujet. Vous pouvez, pour approfondir, vous en remettre au livre que j'ai co-écrit avec lui, et qui est référencé dans ma signature.

    Bonne lecture !

    @++

Discussions similaires

  1. Réponses: 10
    Dernier message: 18/06/2009, 13h27
  2. insert données provenant d'une autre table
    Par jd416 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 31/07/2008, 09h55
  3. Réponses: 8
    Dernier message: 16/01/2008, 17h49
  4. Réponses: 5
    Dernier message: 16/06/2006, 22h39
  5. [ODBC] Récupération d'une donnée pour insertion dans une autre table
    Par rom950 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 10/03/2006, 17h13

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