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)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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
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
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 ***********************
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 ***********************
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 ***********************