Den allmänna lösningen kan hittas genom att söka efter:"Directed Acyclic Graph", "Traversal", "SQL". hansolav.net/sql/graphs.html#topologicalsorting har bra information.
Om du behöver ett snabbt svar, här är en snabb och smutsig metod. Det är inte effektivt, och det behöver en acyklisk ingång, men det är läsbart för någon som inte är bekant med sql.
SELECT id, FromUrl, ToUrl
INTO #temp
FROM dbo.redirect
WHILE @@ROWCOUNT > 0
BEGIN
UPDATE cur
SET ToUrl = nxt.ToURL
FROM #temp cur
INNER JOIN #temp nxt ON (cur.ToURL = nxt.FromURL)
END
SELECT * FROM #temp
Alternativt med en rekursiv CTE:
;WITH cte AS (
SELECT 1 as redirect_count, id, FromURL, ToUrl
FROM dbo.redirect
UNION ALL
SELECT redirect_count + 1, cur.id, cur.FromURL, nxt.ToURL
FROM cte cur
INNER JOIN @t nxt ON (cur.ToURL = nxt.FromURL)
)
SELECT
t1.id, t2.FromUrl, t2.ToUrl
FROM dbo.redirect t1
CROSS APPLY (
SELECT TOP 1 FromUrl, ToUrl
FROM cte
WHERE id = t1.id
ORDER BY redirect_count DESC
) t2