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. pandas.DataFrame.to_sqlの最適なチャンクサイズパラメーター

    2. 複数の列グループを持つOracleベースのPIVOT

    3. Oracleリスナーが実行されておらず、起動しない

    4. Mysqlの一致...対%term%のような単純なもの