sql >> Databasteknik >  >> RDS >> Sqlserver

Hitta början och slutet av en omdirigeringskedja

Den allmänna lösningen kan hittas genom att söka efter:"Directed Acyclic Graph", "Traversal", "SQL". hansolav.net/sql/graphs.html#topologicalsorting har bra information.

Om du behöver ett snabbt svar, här är en snabb och smutsig metod. Det är inte effektivt, och det behöver en acyklisk ingång, men det är läsbart för någon som inte är bekant med 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

Alternativt med en rekursiv 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. Varför är det mycket långsammare att använda en INT för att välja ett Varchar-index som innehåller tal än att använda Strings?

  2. Mysql Hitta saknade datumintervall

  3. Salesforce SOQL från Apache OpenOffice

  4. Sequelize läser endast datumtid i UTC