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

MS SQL Server Discussion :

concatenation des données d'une table dans une autre


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Avril 2004
    Messages : 78
    Points : 56
    Points
    56
    Par défaut [Resolu]concatenation des données d'une table dans une autre
    Bonjour,

    Le titre n'est pas très explicite, alors voici mon problème:
    J'ai une table qui contient
    Table1:
    A | B | C|
    7 | X | 7 |
    7 | Y | 8 |
    7 | Z | 15|
    et une autre table de la forme:
    Table2
    D | E
    7 | X

    Je dois donc faire un update sur la table2 pour que le champ E(table2) prenne la concatenation du champ B(table1) où A=D mais C<>A
    je devrais donc avoir
    D | E
    7 |X+Y+Z

    or je n'arrive qu'à faire une seule concaténation et je me retrouve avec le résultat:
    D | E
    7 | X+Z

    je n'arrive pas à comprendre pourquoi, j'utilise le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    update Table2
    Set Table2.E=Table2.E + '+ ' + Table1.B
    FROM Table1 
    INNER JOIN Table2 
    ON Table1.G=Table2.G AND Table1.A=Table2.D
    WHERE Table1.A<>Table1.C
    ça fait 3 heures que je me casse la tête là dessus, j'espère que vous pourrez m'aider

    mERCI

  2. #2
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Bonjour,

    Je n'ai pas tout compris.

    Vous dites :
    champ E(table2) prenne la concatenation du champ B(table1) où A=D mais C<>A
    Mais dans votre example :
    (A, B, C) avec D=7
    (7, X, 7) => Pas ok car C==A
    (7, Y, 8 ) => ok
    (7, Z, 15) => ok

    => E = Y+Z et non pas E = X+Y+Z

    Non ?

  3. #3
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Je vais surement dire des bêtises, mais voici ce que j'en pense.

    Je tire l'analyse qui suit des triggers que j'ai eu à développer. Je m'explique :
    Si je veux travailler sur un trigger sur un update, SQLServeur me propose deux tables pour travailler : inserted et deleted.
    • deleted correspond à la table updatée avant la modif
    • inserted correspond à la table updatée après la modif


    Pour moi la modification consiste à construire inserted en se basant sur deleted

    Ainsi quand vous demandez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Table2.E=Table2.E + '+ ' + Table1.B
    , à chaque fois vous vous basez sur la valeur d'origine, et pas les valeurs intermédiares.

    Ceci n'engage que moi, ne pas me prendre au pied de la lettre. Si un pro pouvait confirmer ou refuter ca serait bien...

  4. #4
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Avril 2004
    Messages : 78
    Points : 56
    Points
    56
    Par défaut
    dans mon exemple
    (A, B, C) avec D=7
    (7, X, 7) => Pas ok car C==A
    (7, Y, 8 ) => ok
    (7, Z, 15) => ok

    => E = Y+Z et non pas E = X+Y+Z
    on refuse X de la table2 car E a déjà la valeur X dans la table1

    donc il me reste à ajouter Y+Z pour obtenir X+Y+Z

    or j'obtiens 2 ligne X+Y et X+Z

    Les triggers pourraient m'aider, mais je ne sais pas trop m'en servir, vous pourriez me donner un exemple?

  5. #5
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Citation Envoyé par Fabby69
    on refuse X de la table2 car E a déjà la valeur X dans la table1 donc il me reste à ajouter Y+Z pour obtenir X+Y+Z or j'obtiens 2 ligne X+Y et X+Z
    Rien compris !

    Citation Envoyé par Fabby69
    Les triggers pourraient m'aider[...]
    Je n'ai jamais dis ça ! j'ai juste basé mon analyse sur ma (maigre) expérience des triggers... Si vous voulez attaquer le problème par les triggers pourquoi pas, néanmoins je regarderais personnellement du coté des curseurs.

    Voici comment je ferais :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    --on declare qq variables
    DECLARE @cle INT, 
    	@g [***type de g***],
    	@d [***type de g***],
    	@b [***type de b***]
    --on parcours les lignes de table2 identifié par cle
    DECLARE index_t2 CURSOR READ_ONLY
    	FOR 
    		SELECT cle, g, d 
    		FROM table2
    OPEN index_t2
    FETCH NEXT FROM index_t2 INTO @cle, @g, @d
    WHILE @@fetch_status = 0 BEGIN
     
    	--on récupère la colonne b de table1 qui correspond à t1.g = t2.g && t1.a = t2.d && t1.a != t2.c
    	DECLARE index_t1 CURSOR READ_ONLY
    		FOR 
    			SELECT b 
    			FROM table1 
    			WHERE g = @g AND a = @d AND a != c
    	OPEN index_t1
    	FETCH NEXT FROM index_t1 INTO @b
    	WHILE @@fetch_status = 0 BEGIN
     
    		--On met à jour table2.e
    		UPDATE table2
    		SET e = e + ' + ' + @b
    		WHERE cle = @cle
     
    		--On passe à la valeur b suivante
    		FETCH NEXT FROM index_t1 INTO @b
    	END
    	CLOSE index_t1
    	DEALLOCATE index_t1
     
    	--On passe à la ligne suivante de table2
    	FETCH NEXT FROM index_t2 INTO @cle, @g, @d
    END
    CLOSE index_t2
    DEALLOCATE index_t2
    [edit] Je trouve que la documentation de TransactSQL est bien faite. Je vous conseille d'y jeter un oeil ![/edit]

  6. #6
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Avril 2004
    Messages : 78
    Points : 56
    Points
    56
    Par défaut
    Je vais essayer cette solution, je ne connaissais pas les curseurs, en fait je suis novice sur SQLServer, et c'est pourquoi je bloque sur certains points. J'ai pu voir en effet que la doc était plutôt bien faite, encore faut il savoir où chercher, et c'est un peu là mon problème.

    Je vous remercie en tout cas pour ce code que je vais tester et pour votre aide.

  7. #7
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Avril 2004
    Messages : 78
    Points : 56
    Points
    56
    Par défaut
    Super!!!! ça fonctionne avec les curseur mais par contre ça prend pas mal de temps (1 table de 19233 enregistrement l'autre de 7168, temps d'execution:>2mn). ça doit pouvoir s'optimiser à ce niveau aussi.

    En tout cas je te remercie car j'étais loin de la solution

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

Discussions similaires

  1. Charger une JComboBox ou une JList des données d'un champ d'une table dans une BDD.
    Par MasterMbg dans le forum Codes sources à télécharger
    Réponses: 2
    Dernier message: 27/09/2013, 12h16
  2. Réponses: 6
    Dernier message: 22/07/2013, 16h24
  3. copier une table d'une BDD dans une table d'une autre BDD
    Par faniette dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/05/2013, 10h17
  4. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  5. [AC-2003] insert des données d'une table dans une table d'une base externe
    Par marieo dans le forum VBA Access
    Réponses: 1
    Dernier message: 30/11/2009, 14h29

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