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 :

Compréhension d'une CTE


Sujet :

MS SQL Server

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 472
    Points : 71
    Points
    71
    Par défaut Compréhension d'une CTE
    Bonjour à tous,

    pouvez vous m'expliquer ce que fait cette CTE qui permet de concaténer des mots que j'ai trouvé ici http://sqlpro.developpez.com/cours/s...te-recursives/


    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
    WITH
    phrases (phrase, id, position)
    AS
    (
    SELECT CAST(PHR_MOT AS VARCHAR(max))
          + CASE
               WHEN SUBSTRING(PHR_MOT, LEN(PHR_MOT), 1) = '''' THEN ''
               ELSE ' '
            END, PHR_ID, PHR_MOT_POSITION
    FROM   T_PHRASE_PHR
    WHERE  PHR_MOT_POSITION = 1
    UNION ALL
    SELECT phrase + CAST(PHR_MOT AS VARCHAR(max))
                 + CASE
                      WHEN SUBSTRING(PHR_MOT, LEN(PHR_MOT), 1) = '''' THEN ''
                      ELSE ' '
                   END AS PHRASE,
          PHR_ID, PHR_MOT_POSITION
    FROM   T_PHRASE_PHR AS suiv
          INNER JOIN phrases
                ON suiv.PHR_ID = phrases.id
                   AND suiv.PHR_MOT_POSITION = phrases.position + 1
    ),
    maxphrase
    AS
    (
    SELECT id, MAX(position) AS maxposition
    FROM   phrases
    GROUP  BY id
    )
    SELECT P.id, RTRIM(phrase) + '.' AS PHRASE
    FROM   phrases AS P
          INNER JOIN maxphrase AS M
                ON P.id = M.id
                   AND P.position = M.maxposition
    ORDER  BY id
    Merci

  2. #2
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Cela écrit la phrase par récursion à partir d'une table de mots.
    Ca part du 1er mot (initialisation) puis ça ajoute tous les mots un à un (récursion, en séparant par un espace sauf si la dernière lettre est une apostrophe).
    Enfin avec maxphrase on sélectionne la phrase au complet, c'est à dire celle qui a le dernier mot, et au final il y a une jointure qui sélectionne la phrase au complet et ajoute le point final.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 472
    Points : 71
    Points
    71
    Par défaut
    Merci pour ta réponse,

    Tu m'as aidé à mieux comprendre le code , cela dit je dois faire un petit déroulement Pour que ça soit plus claire pour moi.

  4. #4
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    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
    42
    43
    44
    45
    46
    47
    48
     
    WITH
    -- CTE
    phrases (phrase, id, position)
    AS
    (
    -- Initialisation : les 1ers mots de chaque phrase
    SELECT CAST(PHR_MOT AS VARCHAR(max))
          -- on rajoute un espace ou une apostrophe selon la dernière lettre du mot
           + CASE
               WHEN SUBSTRING(PHR_MOT, LEN(PHR_MOT), 1) = '''' THEN ''
               ELSE ' '
            END, PHR_ID, PHR_MOT_POSITION
    FROM   T_PHRASE_PHR
    WHERE  PHR_MOT_POSITION = 1
     
    -- on a donc au terme de ce premier select tous les 1ers mots des phrases
     
    UNION ALL
    -- phase de récursion : on prend toutes les phrases en cours, et on rajoute le mot suivant de la même phrase
     
    SELECT phrase + CAST(PHR_MOT AS VARCHAR(max))
                 + CASE
                      WHEN SUBSTRING(PHR_MOT, LEN(PHR_MOT), 1) = '''' THEN ''
                      ELSE ' '
                   END AS PHRASE,
          PHR_ID, PHR_MOT_POSITION
    FROM   T_PHRASE_PHR AS suiv -- là où en est
          INNER JOIN phrases -- on récupère le mot des phrase avec position suivante
                ON suiv.PHR_ID = phrases.id
                   AND suiv.PHR_MOT_POSITION = phrases.position + 1
    ),
    -- au final on a donc un select qui comprend toutes les étapes de toutes mes phrases : mot 1, mot 1 + mot 2, mot 1 + mot 2 + ... + mot final
    maxphrase
    AS
    (
    -- on calcule donc le dernier mot pour chaque phrase
    SELECT id, MAX(position) AS maxposition
    FROM   phrases
    GROUP  BY id
    )
    -- et on sélectionne l'étape contenant le dernier mot pour chaque phrase
    SELECT P.id, RTRIM(phrase) + '.' AS PHRASE
    FROM   phrases AS P
          INNER JOIN maxphrase AS M
                ON P.id = M.id
                   AND P.position = M.maxposition
    ORDER  BY id

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 472
    Points : 71
    Points
    71
    Par défaut
    Merci beaucoup

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

Discussions similaires

  1. [POO] Compréhension d'une ligne de code
    Par Carb0 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 27/11/2008, 10h23
  2. Compréhension d'une fonction sous Oracle
    Par sat83 dans le forum SQL
    Réponses: 2
    Dernier message: 15/11/2007, 14h43
  3. [SS2K5] : Peupler une CTE avec une procédure stockée
    Par jeff37 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 24/03/2007, 10h25
  4. Petit problème de compréhension d'une ligne de code
    Par totoc1001 dans le forum Images
    Réponses: 3
    Dernier message: 12/03/2007, 21h44
  5. Problème de compréhension d'une classe
    Par goldorax113 dans le forum Langage
    Réponses: 5
    Dernier message: 25/10/2006, 22h50

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