Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Намерете началото и края на веригата за пренасочване

Общото решение може да бъде намерено при търсене на:„Насочена ациклична графика“, „Обхождане“, „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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Кои настройки осигуряват формат за дата и час по подразбиране на SQL Server?

  2. Проверете дали съществува временна таблица и изтрийте дали съществува, преди да създадете временна таблица

  3. Изберете редове, които не са в друга таблица, заявка на SQL Server

  4. Как да се свържа с база данни на SQL Server чрез PHP?

  5. Динамично задайте име на файл към низа за връзка в excel