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 49 50 51 52 53 54
|
;WITH matable AS (
SELECT 'GTETS' AS table1, 'SVCDV' AS table2, CAST('gtets.numgtets = svcdv.etssvcdv' AS VARCHAR(100)) AS sql UNION ALL
SELECT 'SGART' AS table1, 'SVLCV' AS table2, 'sgart.numsgart = svlcv.artsvlcv' AS sql UNION ALL
SELECT 'SVCDV' AS table1, 'SKDRE' AS table2, 'svcdv.ecvsvcdv <= 158' AS sql UNION ALL
SELECT 'SVFAV' AS table1, 'SVCDV' AS table2, 'svfav.numsvfav = svcdv.favsvcdv and svfav.etssvfav = svcdv.etssvcdv' AS sql UNION ALL
SELECT 'SVCDV' AS table1, 'SVCLI' AS table2, 'svcdv.clisvcdv = svcli.numsvcli and svcdv.etssvcdv = svcli.etssvcli' AS sql UNION ALL
SELECT 'SVCVE' AS table1, 'SVCDV' AS table2, 'svcve.nuisvcve = svcdv.nuisvcdv' AS sql UNION ALL
SELECT 'GTETS' AS table1, 'SVCDV' AS table2, 'gtets.numgtets = svcdv.etssvcdv' AS sql UNION ALL
SELECT 'SVLCV' AS table1, 'SVCDV' AS table2, 'svlcv.nuisvlcv = svcdv.nuisvcdv' AS sql UNION ALL
SELECT 'SGART' AS table1, 'SGAAE' AS table2, 'sgart.numsgart = sgaae.artsgaae' AS sql
),
sr1 AS (
SELECT table1, table2, sql FROM matable UNION SELECT table2, table1, sql FROM matable
),
sr2 AS (
SELECT
CAST(1 AS INT) as L,
table1,
table2,
CAST(sr1.sql AS VARCHAR(MAX)) AS chemin,
CAST(table1 AS VARCHAR(MAX)) +'->' + table2 + ' | 'as rte
FROM sr1
WHERE table1 = 'GTETS'
UNION ALL
SELECT
sr2.L + 1,
sr1.table1,
sr1.table2,
CAST(sr2.chemin AS VARCHAR(MAX)) + CAST(' AND ' AS VARCHAR(5)) + CAST(sr1.sql AS VARCHAR(MAX)),
rte + CAST(sr1.table1 AS VARCHAR(MAX)) +'->' + sr1.table2 + ' | '
FROM sr2
INNER JOIN sr1
ON sr2.table2 = sr1.table1
AND sr2.rte NOT LIKE '%->' + sr1.table2 + ' |%'--sr1.table2 <> sr2.table1 => pour eviter les boucles infinie
WHERE NOT EXISTS(
SELECT *
FROM sr1
WHERE sr1.table1 = sr2.table2
AND sr1.table2 = 'SVLCV'
)
)
SELECT --il reste a jouter la derniere etape, non incluse car condition d'arret de la recursion
rte,
sr2.L + 1 as niveau,
sr1.table1,
sr1.table2,
CAST(sr2.chemin AS VARCHAR(MAX)) + CAST(' AND ' AS VARCHAR(5)) + CAST(sr1.sql AS VARCHAR(MAX)) as chemin
FROM sr2
INNER JOIN sr1
ON sr2.table2 = sr1.table1
AND sr1.table2 = 'SVLCV'
OPTION (MAXRECURSION 0) |
Partager