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 une concatenation de résultat


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté

    Inscrit en
    Juin 2008
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 307
    Par défaut Update avec une concatenation de résultat
    Dans un soucis de faire un traitement efficace, je souhaite éviter l'utilisation de procédure stockées. Mon problème est que je n'arrive pas à faire ce que je souhaite et au final je ne sais pas si c'est possible.

    J'ai deux tables une qui contient une ligne par couple contact/code_operation

    contact A | Code ope A
    contact A | Code ope B
    contact A | Code ope C
    contact B | Code ope B
    contact C | Code ope A
    contact C | Code ope B

    et une seconde dans laquelle je souhaite avoir les contact dédoublonnés et dans une seconde colonne, les codes opération concaténés. Avec l'exemple ci-dessus ça donnerait ça :

    contact A |Code ope A;Code ope B;Code ope C;
    contact B |Code ope B;
    contact C |Code ope A;Code ope B;


    J'arrive a dédoublonner mes contacts, mais je coince sur la concaténation des codes opération.

    J'arrive a concaténer les code opé pour un contact donné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DECLARE @AllOpe NVARCHAR(4000);
    SET @AllOpe = ''
    SELECT @AllOpe = @AllOpe + CodeOperation + ';'
    FROM MA_TABLE WHERE contact = 'contact A'
    PRINT @AllOpe
    Je me suis dit qu'en la mettant dans un update avec une jointure le tour serait joué mais ca ne fonctionne pas. Il ne me met qu'un seul code opération.

    Voici la requête d'update que j'utilise

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE D SET 
    D.CodeOperation = ISNULL(D.CodeOperation,'') + G.CodeOperation + ';'
    FROM MA_TABLE G
    INNER JOIN  MA_TABLE_1 D 
    ON 
    D.Contact = G.Contact
    Je ne comprends pas trop pourquoi à chaque update il ne me concaténe pas le code operation

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Citation Envoyé par bilbot Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE D SET 
    D.CodeOperation = ISNULL(D.CodeOperation,'') + G.CodeOperation + ';'
    FROM MA_TABLE G
    INNER JOIN  MA_TABLE_1 D 
    ON 
    D.Contact = G.Contact
    Ce n'est pas comme ça que fonctionne SQL.
    Vous avez une interprétation itérative d'une mécanique pourtant ensembliste.

    Pour faire une concaténation vous pouvez soit utiliser une CTE récursive soit FOR XML PATH('').

  3. #3
    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 : 44
    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
    Par défaut
    Bonjour,

    C'est effectivement faisable avec une CTE récursive, mais FOR XML PATH est bien plus rapide :

    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
    DECLARE @t TABLE
    (
    	Contact varchar(16)
    	, CodeOperation varchar(16)
    )
     
    INSERT INTO @t
    VALUES ('contact A', 'Code ope A')
    	, ('contact A', 'Code ope B')
    	, ('contact A', 'Code ope C')
    	, ('contact B', 'Code ope B')
    	, ('contact C', 'Code ope A')
    	, ('contact C', 'Code ope B')
     
    SELECT		DISTINCT T.Contact
    		, O.code_operation_concat
    FROM		@t AS T
    CROSS APPLY	(
    			SELECT	CodeOperation + ';'
    			FROM	@t AS S
    			WHERE	S.Contact = T.Contact
    			FOR	XML PATH ('')
    		) AS O (code_operation_concat)
    ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT	DISTINCT T.Contact
    	, (
    		SELECT	CodeOperation + ';'
    		FROM	@t AS S
    		WHERE	S.Contact = T.Contact
    		FOR	XML PATH ('')
    	) AS codes_operation
    FROM	@t AS T
    @++

  4. #4
    Membre expérimenté

    Inscrit en
    Juin 2008
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 307
    Par défaut
    Merci beaucoup ça marche nickel !

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

Discussions similaires

  1. RecordSource avec une requête sans résultat
    Par temar dans le forum Access
    Réponses: 4
    Dernier message: 23/05/2006, 18h13
  2. Combiner un Select et un Update avec une close Union ?
    Par Cygnus Saint dans le forum Langage SQL
    Réponses: 6
    Dernier message: 14/03/2006, 18h48
  3. [VB] faire un update avec une bdd en xml
    Par ekmule dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 01/02/2006, 22h41
  4. Update avec une sous requête
    Par Deejoh dans le forum Installation
    Réponses: 7
    Dernier message: 25/01/2006, 11h50
  5. Faire un update avec une ss requete renvoyant plusieur row
    Par djodjo dans le forum Langage SQL
    Réponses: 6
    Dernier message: 02/09/2005, 15h51

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