Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Kueri data struktur pohon di SQL Server

Saya tidak berpikir ada yang salah dengan desainnya, dengan asumsi Anda memiliki tingkat hubungan orang tua-anak yang terbatas. Berikut adalah contoh cepat mengambil hubungan menggunakan CTE rekursif:

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

Jangan lupa bersih-bersih:

DROP TABLE dbo.tree;

Ini mungkin artikel yang berguna. Alternatifnya adalah hierarchyid tapi menurut saya ini terlalu rumit untuk kebanyakan skenario.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan CASE untuk Mengembalikan String Jika Tidak Ada Hasil Dari Pernyataan SELECT

  2. ANTARA operator vs.>=DAN <=:Apakah ada perbedaan kinerja?

  3. Berikan izin SELECT pada tampilan, tetapi tidak pada objek yang mendasarinya

  4. Baca dan Tingkatkan nilai int di SQL Server

  5. Denormalisasi Data (Mungkin Pivot?)