2009-03-03 7 views
3

Nehmen wir an, wir haben wir haben eine Tabelle mit den klassischen rekursive Beziehung ‚Manager id‘:Wie niedrigsten gemeinsamen übergeordneten für 2 Reihen in rekursiven Tabelle zu erhalten (SQL)

Benutzer User_id int manager_id int (bezieht sich auf user_id)

Wenn Sie nach dem Zufallsprinzip 2 Zeilen in der Tabelle - oder 2 Knoten - wie finden Sie die niedrigste Ebene, gemeinsame Vorfahren? Meine Plattform ist SQL Server 2005 (Transact-SQL), aber jeder ANSI kompatible SQL wird auch funktionieren ...

Antwort

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

Ein paar kleineren Änderungen an Quassnoi Antwort, und es funktioniert:

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

Was waren die Bearbeitungen? Ich sehe keinen Unterschied :) – Quassnoi

+0

h.parent , vor wählen sehr gering :) danke für die ursprüngliche Antwort –