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 |
Partager