Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/01/2011, 09h21   #1
Candidat au titre de Membre du Club
 
Inscription : mars 2009
Messages : 73
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 73
Points : 13
Points : 13
Par défaut Calculs sur Recursivité

Bonjour à tous,

Voici donc mon problème. J'ai une récursivité sur ma table produit et je voudrai savoir de combien de noeuds se compose un produit.
Je pense qu'une CTE résoudrai assez simplement cette exercice mais je bloque

Jeu de test:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
declare @Prod TABLE (IdProd int, IdProdPere int)
 
INSERT INTO @Prod (IdProd, IdProdPere) VALUES (1,NULL)
INSERT INTO @Prod (IdProd, IdProdPere) VALUES (2,NULL)
INSERT INTO @Prod (IdProd, IdProdPere) VALUES (3,1)
INSERT INTO @Prod (IdProd, IdProdPere) VALUES (4,NULL)
INSERT INTO @Prod (IdProd, IdProdPere) VALUES (5,3)
INSERT INTO @Prod (IdProd, IdProdPere) VALUES (6,NULL)
INSERT INTO @Prod (IdProd, IdProdPere) VALUES (7,2)
INSERT INTO @Prod (IdProd, IdProdPere) VALUES (8,NULL)
INSERT INTO @Prod (IdProd, IdProdPere) VALUES (9,NULL)
INSERT INTO @Prod (IdProd, IdProdPere) VALUES (10,9)
INSERT INTO @Prod (IdProd, IdProdPere) VALUES (11,10)
INSERT INTO @Prod (IdProd, IdProdPere) VALUES (12,NULL)
INSERT INTO @Prod (IdProd, IdProdPere) VALUES (13,11)
 
SELECT * FROM @Prod
Le résultat souhaité est le suivant :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
IdProd Qte
------ ---
     1   0
     2   0
     3   1
     4   0
     5   2
     6   0
     7   1
     8   0
     9   0
    10   1
    11   2
    12   0
    13   3
fufurax est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/01/2011, 11h53   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour


essayez ceci :
Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
;WITH CTE (IdProd, NbParent) AS(
	SELECT idProd, 0
	FROM @Prod
	WHERE IdProdPere IS NULL
	UNION ALL
	SELECT P.IdProd, NbParent + 1
	FROM @Prod AS P
	INNER JOIN CTE ON CTE.IDProd = P.IDProdPere
)
SELECT * 
FROM CTE
ORDER BY IDProd
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/01/2011, 16h43   #3
Candidat au titre de Membre du Club
 
Inscription : mars 2009
Messages : 73
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 73
Points : 13
Points : 13
Superbe, merci beaucoup

Si ça n'est pas abusé, j'ai homis qu'il me fallait une dernière donnée.

Dans une 3ème colonne, il me faudrai l'IdProdOrigine:

Résultat:


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
IdProd NbParent IdProdOrigine
------ -------- -------------
     1        0             0
     2        0             0
     3        1             1
     4        0             0
     5        2             1
     6        0             0
     7        1             2
     8        0             0
     9        0             0
    10        1             9
    11        2             9
    12        0             0
    13        3             9
fufurax est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 16h51   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Avec ceci alors :

Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
;WITH CTE (IdProd, NbParent, IDProdOrigine) AS(
	SELECT idProd, 0, idProd
	FROM @Prod
	WHERE IdProdPere IS NULL
	UNION ALL
	SELECT P.IdProd, NbParent + 1, CTE.IdProdOrigine
	FROM @Prod AS P
	INNER JOIN CTE ON CTE.IDProd = P.IDProdPere
)
SELECT 
	idProd, 
	NbParent, 
	CASE IDProdOrigine 
		WHEN idProd THEN 0 
		ELSE IDProdOrigine 
	END AS IDProdOrigine
FROM CTE
ORDER BY IDProd
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 17h08   #5
Candidat au titre de Membre du Club
 
Inscription : mars 2009
Messages : 73
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 73
Points : 13
Points : 13
Un grand MERCI !

Ce travail ensembliste va sauver mon pauvre serveur SQL !
fufurax est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h17.


 
 
 
 
Partenaires

Hébergement Web