WITH Mreza2
AS
(
SELECT od, do FROM OrijentisanaMreza
UNION ALL
SELECT do,od FROM OrijentisanaMreza
)
, Grane AS
(
SELECT Od, Do, CAST('>' + Od + '>' + Do + '>' AS varchar(50)) AS [Path]
FROM Mreza2
UNION ALL
SELECT F.Od, T.Do, CAST(F.Path + T.Do + '>' AS varchar(50))
FROM Grane AS F
JOIN Mreza2 AS T
ON CASE WHEN F.path LIKE '%>' + T.Do + '>%'
THEN 1 ELSE 0 END = 0
AND F.Do = T.Od
)
SELECT
Od
, Do
--, [Path]
, LEFT(Path, LEN(PAth)-1) AS Path
FROM Grane
WHERE
--Od = 'A' and Do = 'B'
OD = 'C' AND Do = 'F'
Od Do Path
C F >C>F
C F >C>D>F
C F >C>D>E>F
C F >C>D>A>E>F
C F >C>D>B>A>E>F
C F >C>B>A>E>F
C F >C>B>A>E>D>F
C F >C>B>A>D>F
C F >C>B>A>D>E>F
C F >C>B>D>F
C F >C>B>D>E>F
C F >C>B>D>A>E>F
Ako ovo odradite, bez WHERE dobicete 350 redova. Za malecnu mrezu od 6 i 10 grana cvorova. Ne znam da li je ovo tacan broj, resenje sam 'prepisao' iz knjige "Inside Microsoft SQL Server 2005 T-SQL Querying", autori Itzik Ben Gan, Lubor Kollar and Dejan Sarka (nas covek izgleda
I ne pitajte kako ovo u stvari radi. Common Table Expressions....
Resenje u knjizi daje i duzinu svakog puta, sto se ovde nije trazilo ;-). Dakle, izgleda da MS SQL moze da odredi sve moguce puteve u ciklicnom neorjentisanom grafu. Sta cete posle s tim silnim putevima, vas problem. Pokusajte na primer da dobijete iz ovoga najkraci put od A fo F. Bellman to radi mnogo brze i efikasnije.
[Ovu poruku je menjao chachka dana 19.12.2007. u 00:33 GMT+1]