sql >> Databasteknik >  >> RDS >> Sqlserver

Trädstrukturdatafråga i SQL Server

Jag tycker inte att det är något fel med designen, förutsatt att du har en begränsad nivå av relationer mellan föräldrar och barn. Här är ett snabbt exempel på att hämta relationen med en rekursiv 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

Glöm inte att städa upp:

DROP TABLE dbo.tree;

Det här kan vara en användbar artikel. Ett alternativ är hierarchyid men jag tycker att det är alltför komplicerat för de flesta scenarier.



  1. Uppdatera en kolumn i samma tabell om det finns dubbletter av poster

  2. MYSQL-fråga för att söka igenom ALLA fält?

  3. Hur ser man index för en databas eller tabell i MySQL?

  4. Python Postgres psycopg2 ThreadedConnectionPool är slut