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 :

Update avec jointure entre 2 tables et concatenation de données


Sujet :

Développement SQL Server

  1. #1
    Membre averti

    Inscrit en
    Juin 2008
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 307
    Points : 364
    Points
    364
    Par défaut Update avec jointure entre 2 tables et concatenation de données
    Bonjour à tous voila mon problème, j'ai 2 tables :

    Une qui contient plusieurs lignes pour une meme adresse mail et pour chaque ligne une valeur differente dans le champ operation

    Une 2nd avec les adresses mail dédoublonnées.

    Je souhaite faire un update de la seconde pour obtenir une concatenation des code opé de la première

    J'ai fait un petit script qui est sensé réaliser cette opération, mais je me rend compte que mes code opé ne sont pas concaténés. (a noter que je traite les données par lot de 10000 enregistrement)

    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
     
    DECLARE @RowIndexMin INT;
    DECLARE @RowIndexMax INT;
    DECLARE @RowCount INT;
    --Initialisation des variables
    SET @RowIndexMin = 0;
    SET @RowIndexMax = 10000;
    SET @RowCount = 1;
    --Select pour récupérer les lignes à traiter :
    WHILE @RowCount > 0
    BEGIN
    	WITH GroupedData AS 
    	(
    		SELECT ROW_NUMBER() OVER(ORDER BY email) RowIndex, *  FROM Table1
    	)
    	-- MAJ du lot de lignes
    	UPDATE D SET 
    		D.[listeOpe] = ISNULL(D.[listeOpe],'') + '_' + CONVERT(VARCHAR(MAX),G.[codeOpe]) + '_;'
    	FROM Table2 D INNER JOIN GroupedData G ON D.email = G.email WHERE @RowIndexMin <= G.RowIndex AND G.RowIndex <= @RowIndexMax;
    	SET @RowCount = (SELECT @@ROWCOUNT);
    	--MAJ des borne pour sélectionner le prochain lot de lignes
    	SET @RowIndexMin = @RowIndexMin + 100001;
    	SET @RowIndexMax = @RowIndexMax + 100001;
     
    END
    Pour moi la jointure ci dessus, pour une adresse mail, va faire autant d'update qu'il y a de ligne correspande dans la première table mais ca ne semble pas le cas.

    Du coup je vois pas trop comment résoudre ce problème sans passer par des curseurs. si vous avez des idées je suis preneur.

    Olivier

  2. #2
    Invité
    Invité(e)
    Par défaut
    Ça aurait bien trop simple avec les DDL des tables en question...

  3. #3
    Membre averti

    Inscrit en
    Juin 2008
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 307
    Points : 364
    Points
    364
    Par défaut
    La structure de la table étant extrément simple et décrite dans mon sujet, je ne l'ai effectivement pas mise, la voici :

    table 1

    champs 1 : email (texte)
    champs 2 : codeOpe (texte)

    table 2 :

    champs 1 : email (texte)
    champs 2 : listeOpe (texte)

  4. #4
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Quelque chose du genre :

    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
    ;WITH listOpeGenerate
    AS
    (
    	SELECT 
    		email
    		,STUFF( (SELECT ', ' + t1.codeOpe
    				 FROM table1 AS t1
    				 WHERE t1.email = tt1.email
    				 ORDER BY t1.email
    				 FOR XML PATH('') ), 1, 1, '') AS codeOpeList
    	FROM table1 AS tt1
    	GROUP BY email
    )
    UPDATE table2
    SET listOpe = le.codeOpeList
    FROM table2 AS t2u
    	JOIN listOpeGenerate AS le
    		ON le.email = t2u.email
    ++

  5. #5
    Membre averti

    Inscrit en
    Juin 2008
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 307
    Points : 364
    Points
    364
    Par défaut
    Merci pour votre aide ! Mon problème est résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] Requête avec jointure entre 3 tables
    Par adt301 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 16/10/2014, 08h29
  2. Update avec Jointure entre 2 Tables
    Par ticain dans le forum Oracle
    Réponses: 2
    Dernier message: 26/03/2014, 12h50
  3. Réponses: 5
    Dernier message: 09/03/2012, 10h31
  4. [Débutant] select avec jointure entre 4 tables
    Par ulyssemac dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/11/2007, 19h39
  5. update jointure entre 2 tables
    Par papy_tergnier dans le forum SQL
    Réponses: 2
    Dernier message: 16/10/2007, 17h12

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