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 :

déconcatener les éléments d'une ligne d'une colonne


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 53
    Points : 22
    Points
    22
    Par défaut déconcatener les éléments d'une ligne d'une colonne
    Bonjour,

    je dispose de cette procédure :

    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
    ALTER PROCEDURE [dbo].[chemin2]
    		--paramètres	
    	@org varchar(50),
    	@dest varchar(50)
    AS 
     
    BEGIN	
    	SET NOCOUNT ON;
     
    	WITH step (destination, etapes)  -- Vue temporaire
     
    AS
    		--première requête = point de départ de la récursivité
    		(SELECT lieu1, CAST(@org AS VARCHAR(MAX)) 
    			FROM   Liens_lieux
    			WHERE  lieu1 = @org
     
        UNION  ALL
    		--deuxième requête = point d'arrêt de la récursivité
    		SELECT lieu2 , depart.etapes + ', ' + arrivee.lieu2
     
    			FROM   Liens_lieux AS arrivee
    			INNER JOIN step AS depart    --cycle de récursion
    							 ON depart.destination = arrivee.lieu1)
    		--affichage
     
    SELECT etapes
    FROM   step
    WHERE  destination = @dest
     
     
    END
    C'est une récursion chargée de trouver tous les chemins menant d'un point à un autre.
    elle me donne le résultat sous cette forme :

    etapes
    1 fosse1, E1, TC1, C1
    2 fosse1, E2, TC1, C1

    dans cet exemple il existe 2 chemins partant de fosse1 pour arriver à C1.
    Je souhaiterais avoir les résultats sous cette forme :

    etapes
    1 fosse1
    1 E1
    1 TC1
    1 C1
    2 fosse1
    2 E2
    2 TC1
    2 C1

    Est-il possible de faire ça? Une "déconcaténation"?

    merci,

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    La solution à travers un exemple :

    http://sqlpro.developpez.com/cours/s...ursives/#LIV-D

    A +

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 53
    Points : 22
    Points
    22
    Par défaut
    Bonjour,

    merci pour le lien.
    pour appliquer cet exemple, je dois avoir un ID (qui correspond à un chemin possible).
    Dois-je créer une table temporaire (ou une table normale) qui aurait les mêmes infos avec l'ID en plus?
    Mais comment faire pour récupérer le numéro de ligne et le transformer en ID?

    merci,

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 53
    Points : 22
    Points
    22
    Par défaut
    J'ai réussi à mettre en place la chose (table temporaire et ID). Seul problème: les étapes retournées pour chaque chemin sont classées par ordre alphabétique... or je souhaiterais les avoir dans leur "ordre d'apparition". la colonne etape est du varchar(50)... comment suprimer ce tri alphabétique?
    ça doit provenir de la récupération de l'ID dans la table temporaire :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ROW_NUMBER() OVER(ORDER BY etapes ) AS 'ID_chemin'
    		, etapes
    INTO #tmpresultat
    FROM   etape
    WHERE  destination = @dest;
    je suppose que c'est ici que l'ordre des etapes est réarrangé alphabétiquement. Comment supprimer ce ORDER BY?


    merci,

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Si vous les voulez dans l'ordre d'apparition, vous devez alors avoir cette information à la source dans une colonne. Si vous ne l'avez pas, il n'y a pas de solution à votre problème car les bases de données étant par nature ensemblistes, il n'y a aucun ordre à défaut (l'ordre de saisie n'existe pas).

    Lisez ceci : http://blog.developpez.com/sqlpro/p5...sont-des-ense/

    A +

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 53
    Points : 22
    Points
    22
    Par défaut
    Re,

    alors comment se fait-il que dans l'exemple de votre cours (très bien fait au passage ) vous récupériez le rôle des personnes dans l'ordre où ils avaient été entrés dans les INSERT INTO. Je ne comprends pas pourquoi je ne suis pas dans le même cas de figure...sachant que ma procédure est la même que la votre...

    merci,

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 53
    Points : 22
    Points
    22
    Par défaut
    autant pour moi, en fait dans votre exemple, c'est également reclassé... de X Z Y on passe à X Y Z...
    j'ai essayé de faire autrement en ajoutant une nouvelle colonne ID_chemin à ma table temporaire, et ça fait toujours la même chose... donc oui apparemment il n'y a pas de solution à mon problème.

    merci,

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/01/2015, 19h30
  2. Réponses: 6
    Dernier message: 17/09/2012, 10h00
  3. Réponses: 4
    Dernier message: 15/10/2009, 14h33
  4. copier une ligne d'une table vers une autre
    Par Adren dans le forum Langage SQL
    Réponses: 5
    Dernier message: 08/08/2006, 12h54
  5. [VB6]créer une copie d'une ligne d'une table
    Par h82kev dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 01/02/2006, 17h08

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