2014-01-14 48 views
0

我有一個SQL Server表中的URL重定向表,每個重定向都有一個ID,一個FromURL和一個ToURL字段。找到重定向鏈的開始和結束

我被要求找到我們在表格中有哪些重定向鏈,以便我們可以用一個重定向替換它們,以便用戶只重定向一次而不是多次。

表中的一個例子是下面:

Sample Table

正如你可以看到,如果用戶訪問URL A,它們將被重定向到B,然後從B到C,然後從C到d我們希望用A到D之間的單個重定向來替換它,以加快頁面加載速度。

我想我可能能夠做到這一點沒有用遞歸CTE光標,但我完全被卡住這一點,最好的我設法到是找到每個鏈具有以下開始:

SELECT r.ID , 
     r.FromURL , 
     r.ToURL 
FROM dbo.redirect r 
WHERE fromURL NOT IN (SELECT ToURL 
         FROM dbo.redirect r2) 

這通過選擇FromURL未被任何其他重定向重定向的任何記錄,給出了鏈(或根本不在鏈中)的開始。當我試圖通過一些遞歸的CTE示例進行跟蹤時,我最終得到的結果是垃圾數據或達到遞歸限制。

理想情況下,我想擺脫這種東西是類似於下面的數據:

Ideal result

正如你可以看到,重定向的連鎖店已經被替換成一個單一的一個,所以每層級中的層次現在直接到鏈的末端。

我只是誰同意做我們的網絡團隊的東西,我現在已經完全找到了我與T-SQL的能力,所以如果有人能幫助我走出這將是最欣賞的DBA。

+0

你能拉下臺,並做到在不同的語言? –

+0

是的,我不明白爲什麼不這樣做,如果在其他語言中做起來更容易,那麼我很高興看到它,我唯一熟悉的其他語言是C#(主要通過SQL CLR程序),但我總是願意嘗試新的東西:-) – steoleary

+0

您可以使用c#並構建有向圖。然後我假設你最終會斷開連線。找到沒有指向它們的所有節點,並壓縮每一行,在開始時存儲所有中間節點。這假定你可以讓這個東西留在內存中或者被快速訪問,所以你不必重新計算它。 –

回答

1

可以找到一般解決方案搜索:「有向無環圖」,「遍歷」,「SQL」。 hansolav.net/sql/graphs.html#topologicalsorting有一些很好的信息。

如果你需要一個快速的答案,這是一個快速和骯髒的方法。它效率不高,需要非循環輸入,但對不熟悉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 

或者,用遞歸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 
+0

乾杯的鏈接,看起來真的很有趣和有用的,我會看看那個,明天的查詢,讓你知道我的身體情況如何。 – steoleary