Giải pháp chung có thể được tìm thấy khi tìm kiếm:"Đồ thị vòng tròn được hướng dẫn", "Truyền tải", "SQL". hansolav.net/sql/graphs.html#topologicalsorting có một số thông tin tốt.
Nếu bạn cần một câu trả lời nhanh, đây là một phương pháp nhanh chóng và hiệu quả. Nó không hiệu quả và nó cần một đầu vào xoay vòng, nhưng nó có thể đọc được đối với những người không quen thuộc với 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
Ngoài ra, với CTE đệ quy:
;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