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

Query sui dati della struttura ad albero in SQL Server

Non penso che ci sia qualcosa di sbagliato nel design, supponendo che tu abbia un livello limitato di relazioni genitore-figlio. Ecco un rapido esempio di recupero della relazione utilizzando un CTE ricorsivo:

USE tempdb;
GO

CREATE TABLE dbo.tree
(
    ID INT PRIMARY KEY,
    name VARCHAR(32),
    ParentID INT FOREIGN KEY REFERENCES dbo.tree(ID)
);

INSERT dbo.tree SELECT 1, 'grandpa', NULL
UNION ALL SELECT 2, 'dad', 1
UNION ALL SELECT 3, 'me', 2
UNION ALL SELECT 4, 'mom', 1
UNION ALL SELECT 5, 'grandma', NULL;

;WITH x AS
(
    -- anchor:
    SELECT ID, name, ParentID, [level] = 0
    FROM dbo.tree WHERE ParentID IS NULL
    UNION ALL
    -- recursive:
    SELECT t.ID, t.name, t.ParentID, [level] = x.[level] + 1
    FROM x INNER JOIN dbo.tree AS t
    ON t.ParentID = x.ID
)
SELECT ID, name, ParentID, [level] FROM x
ORDER BY [level]
OPTION (MAXRECURSION 32);
GO

Non dimenticare di pulire:

DROP TABLE dbo.tree;

Questo potrebbe essere un articolo utile. Un'alternativa è hierarchyid ma lo trovo eccessivamente complesso per la maggior parte degli scenari.