sql >> Database >  >> RDS >> Sqlserver

Opvragen van boomstructuurgegevens in SQL Server

Ik denk niet dat er iets mis is met het ontwerp, ervan uitgaande dat je een beperkt niveau van ouder-kindrelaties hebt. Hier is een snel voorbeeld van het ophalen van de relatie met behulp van een recursieve CTE:

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

Vergeet niet op te ruimen:

DROP TABLE dbo.tree;

Dit kan een nuttig artikel zijn. Een alternatief is hierarchyid maar ik vind het te ingewikkeld voor de meeste scenario's.



  1. Maak verbinding met MariaDB vanuit de Java-toepassing in NetBeans op Linux (Mageia)

  2. SQL-hulp | De selectielijst voor de INSERT-instructie bevat minder items dan de invoeglijst

  3. Inzicht in de sortering op databaseniveau en de impact van het wijzigen ervan voor een database

  4. Fout tijdens het compileren van statische Qt 5.10.0 met PostgreSQL