Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Заявка за данни в дървовидна структура в SQL Server

Не мисля, че има нещо лошо в дизайна, ако приемем, че имате ограничено ниво на взаимоотношения родител-дете. Ето бърз пример за извличане на връзката с помощта на рекурсивен 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

Не забравяйте да почистите:

DROP TABLE dbo.tree;

Това може да е полезна статия. Алтернатива е hierarchyid но го намирам за прекалено сложен за повечето сценарии.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какво е СТАТИСТИЧЕСКО ВРЕМЕ в SQL Server?

  2. Как SqlCacheDependency знае кога да съобщи обратно на слушателите, когато данните в таблица се променят?

  3. Добавете множество записи с помощта на Linq-to-SQL

  4. План за изпълнение на разделен изглед

  5. Как да изпълним dtsx пакети чрез командния ред