sql >> Database >  >> RDS >> Sqlserver

Vind het begin en einde van een omleidingsketen

De algemene oplossing kan worden gevonden door te zoeken naar:"Directed Acyclic Graph", "Traversal", "SQL". hansolav.net/sql/graphs.html#topologicalsorting heeft goede informatie.

Als je een snel antwoord nodig hebt, is hier een snelle en vuile methode. Het is niet efficiënt en het heeft een acyclische invoer nodig, maar het is leesbaar voor iemand die niet bekend is met 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

Als alternatief, met een recursieve 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. Hoe de getelde waarden te krijgen met een kommascheidingsteken als een enkele rijwaarde?

  2. paginatie telling bereik van producten op huidige pagina

  3. Hoe de primaire index te hernummeren

  4. SHA256 in T-sql opgeslagen procedure