sql >> Databáze >  >> RDS >> Sqlserver

Najděte začátek a konec řetězce přesměrování

Obecné řešení lze nalézt hledáním:"Directed Acyclic Graph", "Traversal", "SQL". hansolav.net/sql/graphs.html#topologicalsorting má dobré informace.

Pokud potřebujete rychlou odpověď, zde je rychlá a špinavá metoda. Není efektivní a potřebuje acyklický vstup, ale je čitelný pro někoho, kdo nezná 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

Případně s rekurzivním 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



  1. Ukázková schémata na GitHubu

  2. postgres funkce a transakce s BEGIN

  3. Jak aktualizovat sloupec na základě jiného sloupce v SQL

  4. je možné volat skript SQL z uložené procedury v jiném skriptu SQL?