sql >> Database teknologi >  >> RDS >> Sqlserver

Find starten og slutningen af ​​en omdirigeringskæde

Den generelle løsning kan findes ved at søge efter:"Directed Acyclic Graph", "Traversal", "SQL". hansolav.net/sql/graphs.html#topologicalsorting har nogle gode oplysninger.

Hvis du har brug for et hurtigt svar, er her en hurtig og beskidt metode. Det er ikke effektivt, og det har brug for et acyklisk input, men det kan læses for nogen, der ikke er bekendt 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. Store præstationsproblemer med Oracle DataReader i .Net

  2. Om V-formatelementet i Oracle

  3. Hvordan øger Fixed-længde-poster og Fixed-længde-felter databasens ydeevne?

  4. Hvordan kan jeg lave en batch-indsættelse i en Oracle-database ved hjælp af Python?