Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zapytanie o dane struktury drzewa w SQL Server

Nie sądzę, by było coś złego w projekcie, zakładając, że masz ograniczony poziom relacji rodzic-dziecko. Oto szybki przykład pobierania relacji za pomocą rekurencyjnego 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

Nie zapomnij posprzątać:

DROP TABLE dbo.tree;

To może być przydatny artykuł. Alternatywą jest hierarchyid ale uważam, że jest to zbyt skomplikowane w przypadku większości scenariuszy.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak uzyskać wszystkie dzienniki transakcji (wstawić usunięcie aktualizacji) dla określonej tabeli w SQL Server 2008?

  2. Muszę przekazać nazwy kolumn za pomocą zmiennej w instrukcji select w procedurze sklepu, ale nie mogę użyć dynamicznego zapytania

  3. Jak usunąć nadmiarową przestrzeń nazw w zagnieżdżonej kwerendzie podczas korzystania z FOR XML PATH?

  4. Jakie jest znaczenie składni funkcji RAISERROR()

  5. Korzystanie z liczby wierszy z tabeli tymczasowej w pętli while SQL Server 2008