我有一個SQL Server表中的URL重定向表,每個重定向都有一個ID,一個FromURL和一個ToURL字段。找到重定向鏈的開始和結束
我被要求找到我們在表格中有哪些重定向鏈,以便我們可以用一個重定向替換它們,以便用戶只重定向一次而不是多次。
表中的一個例子是下面:
正如你可以看到,如果用戶訪問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示例進行跟蹤時,我最終得到的結果是垃圾數據或達到遞歸限制。
理想情況下,我想擺脫這種東西是類似於下面的數據:
正如你可以看到,重定向的連鎖店已經被替換成一個單一的一個,所以每層級中的層次現在直接到鏈的末端。
我只是誰同意做我們的網絡團隊的東西,我現在已經完全找到了我與T-SQL的能力,所以如果有人能幫助我走出這將是最欣賞的DBA。
你能拉下臺,並做到在不同的語言? –
是的,我不明白爲什麼不這樣做,如果在其他語言中做起來更容易,那麼我很高興看到它,我唯一熟悉的其他語言是C#(主要通過SQL CLR程序),但我總是願意嘗試新的東西:-) – steoleary
您可以使用c#並構建有向圖。然後我假設你最終會斷開連線。找到沒有指向它們的所有節點,並壓縮每一行,在開始時存儲所有中間節點。這假定你可以讓這個東西留在內存中或者被快速訪問,所以你不必重新計算它。 –