Précédent   Forum des professionnels en informatique > Bases de données > DB2
DB2 Forum d'entraide technique sur la base de données DB2. Voir aussi -> Rubrique DB2
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 08/08/2011, 12h17   #1
Futur Membre du Club
 
Inscription : juin 2007
Messages : 69
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 69
Points : 15
Points : 15
Par défaut Recursivité sur DB2

Bonjour à tous,

Je viens vous voir pour un petit coup de main concernant une requête récursive.
J'ai ma requête récursive qui fonctionne actuellement sur oracle et il faut que je la convertisse pour DB2.

Voila la requête oracle en question :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
WITH matable AS ( 
SELECT 'GTETS' AS table1, 'SVCDV' AS table2, 'gtets.numgtets = svcdv.etssvcdv' AS sql 										FROM dual UNION ALL 
SELECT 'SGART' AS table1, 'SVLCV' AS table2, 'sgart.numsgart = svlcv.artsvlcv' AS sql 										FROM dual UNION ALL 
SELECT 'SVCDV' AS table1, 'SKDRE' AS table2, 'svcdv.ecvsvcdv <= 158' AS sql 												FROM dual UNION ALL 
SELECT 'SVFAV' AS table1, 'SVCDV' AS table2, 'svfav.numsvfav = svcdv.favsvcdv and svfav.etssvfav = svcdv.etssvcdv' AS sql 	FROM dual UNION ALL 
SELECT 'SVCDV' AS table1, 'SVCLI' AS table2, 'svcdv.clisvcdv = svcli.numsvcli and svcdv.etssvcdv = svcli.etssvcli' AS sql 	FROM dual UNION ALL 
SELECT 'SVCVE' AS table1, 'SVCDV' AS table2, 'svcve.nuisvcve = svcdv.nuisvcdv' AS sql 										FROM dual UNION ALL 
SELECT 'SVLCV' AS table1, 'SVCDV' AS table2, 'svlcv.nuisvlcv = svcdv.nuisvcdv' AS sql 										FROM dual UNION ALL 
SELECT 'SGART' AS table1, 'SGAAE' AS table2, 'sgart.numsgart = sgaae.artsgaae' AS sql 										FROM dual 
), 
sr1 AS ( 
SELECT table1, table2, sql FROM matable UNION SELECT table2, table1, sql FROM matable 
), 
sr2 AS ( 
SELECT level, table1, table2, sys_connect_by_path(sql, ' AND ') AS chemin FROM sr1 WHERE table2 = 'SVFAV'  
START WITH table1 = 'SGART' CONNECT BY NOCYCLE table1 = PRIOR table2 ORDER BY level ASC 
) 
SELECT chemin FROM sr2 WHERE rownum = 1
Si quelqu'un à une idée, merci d'avance

Ghosty
ghosty177 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 12h30   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
bonjour,

lisez cet article : http://sqlpro.developpez.com/cours/s...te-recursives/

La syntaxe est identique sous db2 (isereis du moins ... vu que vous n'avez rien précisé d'autre)
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 14h31   #3
Futur Membre du Club
 
Inscription : juin 2007
Messages : 69
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 69
Points : 15
Points : 15
Merci de ta réponse punkoff,
je me sert de ce cours pour essayer de convertir la requête.

pour ce qui est de la base je dois pouvoir exécuter ma requête sur DB2/UDB et DB2/400.
Je supposé, peut-être à tort que la syntaxe serait la même pour les deux.
ghosty177 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 15h59   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Tiens dans ce cas,

La doc officielle
http://publib.boulder.ibm.com/infoce...ivequeries.htm


Un article qui compare la récursion Oracle / db2 :
http://www.ibm.com/developerworks/da...steinbach.html
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 17h59   #5
Futur Membre du Club
 
Inscription : juin 2007
Messages : 69
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 69
Points : 15
Points : 15
salut punkoff

alors la requête commence à être traduite.
Elle s'exécute mais me retourne pas ce qu'il faut :
- D'abord, elle me retourne plein de ligne alors que normalement et devrait me retourner uniquement les chemins valides
- Et ensuite dans le champ concaténé qui se construit avec la récursion, je n'est qu'une concaténation au lieu du chemin complet.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
WITH matable AS ( 
	SELECT 'GTETS' AS table1, 'SVCDV' AS table2, 'gtets.numgtets = svcdv.etssvcdv' AS sql 										FROM dual UNION ALL 
	SELECT 'SGART' AS table1, 'SVLCV' AS table2, 'sgart.numsgart = svlcv.artsvlcv' AS sql 										FROM dual UNION ALL 
	SELECT 'SVCDV' AS table1, 'SKDRE' AS table2, 'svcdv.ecvsvcdv <= 158' AS sql 												FROM dual UNION ALL 
	SELECT 'SVFAV' AS table1, 'SVCDV' AS table2, 'svfav.numsvfav = svcdv.favsvcdv and svfav.etssvfav = svcdv.etssvcdv' AS sql 	FROM dual UNION ALL 
	SELECT 'SVCDV' AS table1, 'SVCLI' AS table2, 'svcdv.clisvcdv = svcli.numsvcli and svcdv.etssvcdv = svcli.etssvcli' AS sql 	FROM dual UNION ALL 
	SELECT 'SVCVE' AS table1, 'SVCDV' AS table2, 'svcve.nuisvcve = svcdv.nuisvcdv' AS sql 										FROM dual UNION ALL 
	SELECT 'SVLCV' AS table1, 'SVCDV' AS table2, 'svlcv.nuisvlcv = svcdv.nuisvcdv' AS sql 										FROM dual UNION ALL 
	SELECT 'SGART' AS table1, 'SGAAE' AS table2, 'sgart.numsgart = sgaae.artsgaae' AS sql 										FROM dual 
), 
sr1 AS ( SELECT table1, table2, sql FROM matable UNION SELECT table2, table1, sql FROM matable ),
sr2(TA, TB, STEP, SQL, MOI) AS 
(
SELECT DISTINCT sr1.table1, sr1.table2, 0, sr1.sql, '' FROM sr1 WHERE sr1.table2 = 'SGART'
UNION ALL
SELECT sr1.table1, sr1.table2, sr2.STEP + 1, sr1.sql, sr2.sql || ' AND ' || sr1.sql FROM sr1, sr2 WHERE sr1.table1 = sr2.TB
)
SELECT * FROM sr2 WHERE sr2.TB = 'SVFAV'

Pourrais-tu jeter un coup d'oeil ?

Merci par avance
ghosty177 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2011, 13h03   #6
Membre chevronné
 
Avatar de bernard59139
 
Administrateur de base de données
Inscription : octobre 2006
Messages : 503
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Administrateur de base de données

Informations forums :
Inscription : octobre 2006
Messages : 503
Points : 688
Points : 688
Bonjour

je ne connais pas Oracle(et la recursivité est restée à l'école), mais rempacer CONNECT BY NOCYCLE par une jointure simple me semble un peu rapide.
bernard59139 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2011, 14h18   #7
Futur Membre du Club
 
Inscription : juin 2007
Messages : 69
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 69
Points : 15
Points : 15
Oui c'est bien possible... tu aurais une idée??
Par ce que j'essaye de m'appuyer sur le cours donner par punkoff en premier lien. Mais vu que je découvre la récursivité, je lutte un peu...
ghosty177 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2011, 20h47   #8
Membre Expert
 
Patrick
Inscription : mai 2008
Messages : 821
Détails du profil
Informations personnelles :
Nom : Patrick
Âge : 42
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : mai 2008
Messages : 821
Points : 1 041
Points : 1 041
La récursivité ce n'est pas compliqué encore faudrait-il que tu sois au minimum en V5R4.
Par contre, peux-tu donner précisément le résultat attendu ?
K2R400 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 13h27   #9
Membre chevronné
 
Avatar de bernard59139
 
Administrateur de base de données
Inscription : octobre 2006
Messages : 503
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Administrateur de base de données

Informations forums :
Inscription : octobre 2006
Messages : 503
Points : 688
Points : 688
Bonjour

Tu n'y arriveras pas sans revoir ta copie.

Tu mélanges les données dès le départ, avec le "UNION ALL".
Comment veux-tu que db2 traite automatiquement?

en ayant testé avec 1 ligne, db2 ne s'en tire pas (boucle puis plantage).

Il te faut des données "bien rangée" ou trouver le truc qui va bien pour remplacer le "CONNECTED" de oracle, ce qui dépasse mes pauvres compétences.

Désolé
a+
bernard59139 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 15h11   #10
Futur Membre du Club
 
Inscription : juin 2007
Messages : 69
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 69
Points : 15
Points : 15
alors voila ou j'en suis avec un peu d'aide, je pense que la requete marche bien mais il faut que je fasse d'autres test :

Code :
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
WITH
 matable(table1 , table2 , sql) AS ( 
SELECT 'GTETS' , 'SVCDV' , 'gtets.numgtets = svcdv.etssvcdv'
 FROM  sysibm.sysdummy1 UNION ALL 
SELECT 'SGART' , 'SVLCV' , 'sgart.numsgart = svlcv.artsvlcv'
 FROM  sysibm.sysdummy1 UNION ALL 
SELECT 'SVCDV' , 'SKDRE' , 'svcdv.ecvsvcdv <= 158'
 FROM  sysibm.sysdummy1 UNION ALL 
SELECT 'SVFAV' , 'SVCDV' , 'svfav.numsvfav = svcdv.favsvcdv and svfav.etssvfav = svcdv.etssvcdv'
 FROM  sysibm.sysdummy1 UNION ALL 
SELECT 'SVCDV' , 'SVCLI' , 'svcdv.clisvcdv = svcli.numsvcli and svcdv.etssvcdv = svcli.etssvcli'
 FROM  sysibm.sysdummy1 UNION ALL 
SELECT 'SVCVE' , 'SVCDV' , 'svcve.nuisvcve = svcdv.nuisvcdv'
 FROM  sysibm.sysdummy1 UNION ALL 
SELECT 'SVLCV' , 'SVCDV' , 'svlcv.nuisvlcv = svcdv.nuisvcdv'
 FROM  sysibm.sysdummy1 UNION ALL 
SELECT 'SGART' , 'SGAAE' , 'sgart.numsgart = sgaae.artsgaae'
 FROM  sysibm.sysdummy1
)
, sr1 AS (
SELECT table1 , table2 , sql FROM matable
UNION ALL
SELECT table2 , table1 , sql FROM matable
)
, sr2(level , TABLES, table2 , chemin) AS (
SELECT 0
     , CAST(table1 AS VARCHAR(40) )
     , table2
     , CAST(sql AS VARCHAR(400) )
 FROM  sr1
 WHERE table1 = 'SGART'
UNION ALL
SELECT level + 1
     , sr2.TABLES || ' , ' || sr1.table1
     , sr1.table2
     , sr2.chemin || ' AND ' || sr1.sql
 FROM  sr1
     , sr2
 WHERE sr1.table1 = sr2.table2
   AND LOCATE(sr1.table1 , sr2.TABLES) = 0
   AND level < 10
)
SELECT chemin
 FROM  sr2
 WHERE table2 = 'SVFAV'
 ORDER BY
       level
ghosty177 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h54.


 
 
 
 
Partenaires

Hébergement Web