3 Stimmen

Wie erhalte ich den niedrigsten, gemeinsamen Elternteil für 2 Zeilen in einer rekursiven Tabelle (SQL)?

Nehmen wir an, wir haben eine Tabelle mit der klassischen rekursiven Beziehung "Manager-ID":

Benutzer benutzer_id int manager_id int (bezieht sich auf user_id)

Wenn Sie zufällig 2 Zeilen in der Tabelle - oder 2 Knoten - auswählen, wie finden Sie den gemeinsamen Vorfahren auf der untersten Ebene? Meine Plattform ist SQL Server 2005 (Transact-SQL), aber jede ANSI-kompatible SQL wird auch funktionieren...

3voto

Ein paar kleine Änderungen an der Antwort von Quassnoi, 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

2voto

Quassnoi Punkte 396418
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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X