Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

CTE AGAIN

2 réponses
Avatar
christophe
Voici une table qui represente un historique d'evolution de cles.
Le but de cette table est de connaitre la nouvelle cle en passant comme
parametre l'ancienne.

la difficulté c'est que parfois plusieurs traitements peuvent avoir eu lieu
et donc cela s'etale sur N lignes


en gros j'aimerais utiliser une cte qui devrait d'apres mes connaissances
repondre à ma demande de la derniere cles viable.

Exemple en entrant la cle ancienne 1 je devrais recuperer la 6
idem si je rentre la 2, la 3... jusqu'a la 5
le rpincipe est le meme avec 15, 16 ou 18 je dois recuperer la 20


je suis donc preneur de cette methode car j'avoue tourner autour,
j'ai une solution via des boucles mais qui ne me plait guere car je ne
connais pas le nombre de boucle a l'avance.


voici le code exemple
CREATE TABLE #DEDOUB ( UID INT IDENTITY(1,1) PRIMARY KEY, ANC_CLE INT,
NEW_CLE INT)
INSERT INTO #DEDOUB (ANC_CLE, NEW_CLE) VALUES (1,2)
INSERT INTO #DEDOUB (ANC_CLE, NEW_CLE) VALUES (2,3)
INSERT INTO #DEDOUB (ANC_CLE, NEW_CLE) VALUES (3,4)
INSERT INTO #DEDOUB (ANC_CLE, NEW_CLE) VALUES (4,5)
INSERT INTO #DEDOUB (ANC_CLE, NEW_CLE) VALUES (5,6)
INSERT INTO #DEDOUB (ANC_CLE, NEW_CLE) VALUES (15,16)
INSERT INTO #DEDOUB (ANC_CLE, NEW_CLE) VALUES (16,18)
INSERT INTO #DEDOUB (ANC_CLE, NEW_CLE) VALUES (18,20)

2 réponses

Avatar
christophe
voila ce que j'ai trouivé et qui fonctionne

ALTER FUNCTION [dbo].[fn_FoundLastCleSP] (@ANC_CLE BIGINT)
RETURNS BIGINT
AS
BEGIN

DECLARE @NEW BIGINT;

WITH FD_CLE (NEW, ANC_CLE)
AS
(
SELECT T1.NOUV_CLE_SOCIETES_PARTICULIERS, T1.ANC_CLE_SOCIETES_PARTICULIERS
FROM [HISTORIQUE_DEDOUBLONNAGE] AS T1
WHERE ANC_CLE_SOCIETES_PARTICULIERS = @ANC_CLE
UNION ALL
SELECT T1.NOUV_CLE_SOCIETES_PARTICULIERS, T1.ANC_CLE_SOCIETES_PARTICULIERS
FROM [HISTORIQUE_DEDOUBLONNAGE] AS T1 INNER JOIN FD_CLE AS T2
ON T1.ANC_CLE_SOCIETES_PARTICULIERS = T2.NEW
)
SELECT @NEW = NEW FROM FD_CLE

RETURN @NEW

END
Avatar
Fred BROUARD
Bonjour,

christophe a écrit :
voila ce que j'ai trouivé et qui fonctionne

ALTER FUNCTION [dbo].[fn_FoundLastCleSP] (@ANC_CLE BIGINT)
RETURNS BIGINT
AS
BEGIN

DECLARE @NEW BIGINT;

WITH FD_CLE (NEW, ANC_CLE)
AS
(
SELECT T1.NOUV_CLE_SOCIETES_PARTICULIERS, T1.ANC_CLE_SOCIETES_PARTICULIERS
FROM [HISTORIQUE_DEDOUBLONNAGE] AS T1
WHERE ANC_CLE_SOCIETES_PARTICULIERS = @ANC_CLE
UNION ALL
SELECT T1.NOUV_CLE_SOCIETES_PARTICULIERS, T1.ANC_CLE_SOCIETES_PARTICULIERS
FROM [HISTORIQUE_DEDOUBLONNAGE] AS T1 INNER JOIN FD_CLE AS T2
ON T1.ANC_CLE_SOCIETES_PARTICULIERS = T2.NEW
)
SELECT @NEW = NEW FROM FD_CLE

RETURN @NEW

END



parfait, mais peut être cela serait mieux si c'était une fonction
table ?



CREATE FUNCTION [dbo].[F_T_FoundLastCleSP] (@ANC_CLE BIGINT)
RETURNS TABLE
AS
RETURN
(
WITH FD_CLE (NEW, ANC_CLE)
AS
(SELECT T1.NOUV_CLE_SOCIETES_PARTICULIERS,
T1.ANC_CLE_SOCIETES_PARTICULIERS
FROM HISTORIQUE_DEDOUBLONNAGE AS T1
WHERE ANC_CLE_SOCIETES_PARTICULIERS = @ANC_CLE
UNION ALL
SELECT T1.NOUV_CLE_SOCIETES_PARTICULIERS,
T1.ANC_CLE_SOCIETES_PARTICULIERS
FROM HISTORIQUE_DEDOUBLONNAGE AS T1
INNER JOIN FD_CLE AS T2
ON T1.ANC_CLE_SOCIETES_PARTICULIERS = T2.NEW)
SELECT NEW FROM FD_CLE
)

Evitez le nom fn_ pour une fonction, comme le sp_ pour une proc. En
effet ces dénominations sont en principe réservées aux fonctions SQL de
base et le moteur SQL les cherchent d'abord dans la base master !

A +

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************