2009-03-03 21 views
3

は、我々は、我々は古典的な「管理者ID」再帰的な関係を持つテーブルを持っている持っているとしましょう再帰テーブル(SQL)で2行のために最低、共通の親を取得するにはどのよう

テーブルまたは2ノードで2行をランダムに選択すると、どのようにして最も低いレベルの共通の祖先が見つかりますか?私のプラットフォームは、SQL Server 2005(のTransact-SQL)であるが、任意のANSI準拠したSQLも動作します...

答えて

2
WITH 
    hier1 (id, parent) AS (
    SELECT id, parent 
    FROM table l 
    WHERE id = @user1 
    UNION ALL 
    SELECT id, parent 
    FROM table l, hier1 h 
    WHERE l.id = parent 
    ), 
    hier2 (id, parent) AS (
    SELECT id, parent 
    FROM table l 
    WHERE id = @user2 
    UNION ALL 
    SELECT id, parent 
    FROM table l, hier1 h 
    WHERE l.id = parent 
    ), 
SELECT TOP 1 hier1.id 
FROM hier1, hier2 
WHERE hier1.id = hier2.id 
3

Quassnoiの答えにいくつかのマイナーな編集、およびそれが動作します:

WITH 
    hier1 (id, parent) AS (
    SELECT  id, parent 
    FROM  table 
    WHERE  id = @user1 
    UNION ALL 
    SELECT  id, parent 
    FROM  table l, hier1 h 
    WHERE  l.id = h.parent 
    ), 
    hier2 (id, parent) AS (
    SELECT  id, parent 
    FROM  table 
    WHERE  id = @user2 
    UNION ALL 
    SELECT  id, parent 
    FROM  table l, hier1 h 
    WHERE  l.id = h.parent 
    ) 
SELECT TOP 1 hier1.id 
FROM hier1, hier2 
WHERE hier1.id = hier2.id 
+0

をした何編集?私は違いが見えません:) – Quassnoi

+0

h.parent 非常にマイナー:)元の答えをありがとう –

関連する問題